牛客小白月赛72

思路有了码不上来???离大谱,得加训咯 ,编码能力有点差难蚌

目录

A-跳跃游戏_牛客小白月赛72 (nowcoder.com)

B-数数_牛客小白月赛72 (nowcoder.com) 

C-操作数组_牛客小白月赛72 (nowcoder.com) 

D-遗迹探险_牛客小白月赛72 (nowcoder.com) 

E-顶级厨师_牛客小白月赛72 (nowcoder.com) 

F-排座位_牛客小白月赛72 (nowcoder.com) 


A-跳跃游戏_牛客小白月赛72 (nowcoder.com)

一开始以为是看数组是不是从小到大排序的,结果挂了几次,还是要认真看看题,下次一定

#include
using namespace std;
int n;
int a[100005];
int main(){cin>>n;for(int i=0;i>a[i];}if(a[0]

B-数数_牛客小白月赛72 (nowcoder.com)

虽然知道是个规律题,但是看了一下数据量不是很大,开个数组暴力求出每个数对应的结果即可,

对sqrt(n)向下取整就是答案

#include
using namespace std;
int t;
int a[4005];
int main(){cin>>t;for(int i=1;i<=4000;i++){int cnt=0;for(int j=1;j<=i;j++){if(i%j==0){cnt++;}}a[i]+=a[i-1];if(cnt%2!=0)a[i]++;}while(t--){int n;cin>>n;cout<
#include
using namespace std;
int t;
int main(){cin>>t;while(t--){int n;cin>>n;int p=sqrt(n);cout<

C-操作数组_牛客小白月赛72 (nowcoder.com)

统计大于的总值和小于的总值是否相等即可

#include
using namespace std;
int n;
int a[100005],b[100005];
long long l,r;
int main(){cin>>n;for(int i=0;i>a[i];}for(int i=0;i>b[i];if(a[i]>b[i])l+=a[i]-b[i];else r+=b[i]-a[i];}if(l==r)cout<

D-遗迹探险_牛客小白月赛72 (nowcoder.com)

一个数组记录从1,1到i,j的最大值,另一个数组记录从n,m到i,j的最大值。然后判断传送门的位置,找到1,1到其中某个传送门的最大值加上某个传送门的位置到n,m的最大值,记录下最大的结果然后输出,注意:不能从这个传送门传送到自己这个传送门的位置

#include
using namespace std;
#define ll long long
int n,m,t;
ll a[1005][1005],b[1005][1005];
int q[6],p[6];
int main(){cin>>n>>m;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>a[i][j];b[i][j]=a[i][j];if(i==1&&j==1)a[i][j]=a[i][j];else if(i==1) a[i][j]=a[i][j-1]+a[i][j];else if(j==1) a[i][j]=a[i-1][j]+a[i][j];else a[i][j]=max(a[i][j-1]+a[i][j],a[i-1][j]+a[i][j]);}}for(int i=n;i>=1;i--){for(int j=m;j>=1;j--){if(i==n&&j==m)b[i][j]=b[i][j];else if(i==n) b[i][j]=b[i][j+1]+b[i][j];else if(j==m) b[i][j]=b[i+1][j]+b[i][j];else b[i][j]=max(b[i][j+1]+b[i][j],b[i+1][j]+b[i][j]);}}cin>>t;while(t--){int k;cin>>k;ll ans=a[n][m];for(int i=0;i>q[i]>>p[i];for(int i=0;i

E-顶级厨师_牛客小白月赛72 (nowcoder.com)

二分答案,大概思路在代码中写了

#include
using namespace std;
#define ll long long
int n,m,k,q;
ll y;
ll a[100005],b[100005],c[1000005];
bool check(ll x){ll cnt=0;for(int i=1;i<=n;i++){cnt+=upper_bound(b+1,b+m+1,x/a[i])-b-1;//计算出比x小的总数量(a[i]*b[j]<=x的总数)}cnt-=upper_bound(c+1,c+k+1,x)-c-1;//减掉限制的数量return cnt>=y;//如果小于美味值的数大于等于y,表示现在的范围过大,要减少有边界;反之增大左边界
}
int main(){cin>>n>>m>>k>>q;for(int i=1;i<=n;i++)cin>>a[i];for(int i=1;i<=m;i++)cin>>b[i];for(int i=1;i<=k;i++){int u,v;cin>>u>>v;c[i]=a[u]*b[v];//标记不能用的}//三种都排序sort(a+1,a+n+1);sort(b+1,b+m+1);sort(c+1,c+k+1);while(q--){cin>>y;//要找到最小的ll l=a[1]*b[1],r=a[n]*b[m];//二分美味值while(l

F-排座位_牛客小白月赛72 (nowcoder.com)

容斥,不会。。。 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章