思路有了码不上来???离大谱,得加训咯 ,编码能力有点差难蚌
目录
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)
容斥,不会。。。