2020-05-26 — 习题训练三
Posted a-specter
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2020-05-26 — 习题训练三相关的知识,希望对你有一定的参考价值。
A - Sorted Adjacent Differences
将这串数字按大小排序,找到中间那个做第一个,左一个右一个输出
int main() { int k,n,i,j,a[100010]; cin>>k; while(k--){ cin>>n; for(i=0;i<n;i++){ cin>>a[i]; } sort(a,a+n); for(i=n/2,j=n/2-1;j>=0||i<=n-1;i++,j--){ if(i<=n-1){ cout<<a[i]<<" "; } if(j>=0){ cout<<a[j]<<" "; } } cout<<endl; } return 0; }
B - Powered Addition
变成一个不递减的数列,数列里的每一个数都得大于之前最大的那一个,与之前最大的哪一项相差最大的,求需要的时间
int main() { ll k,n,i,j,a[100010],z=0; cin>>k; while(k--){ cin>>n; cin>>a[0]; ll max1=a[0],max2=-1,sum=0; for(i=1;i<n;i++){ cin>>a[i]; max1=max(max1,a[i]); max2=max(max2,max1-a[i]); } j=1; z=0; while(sum<max2){ sum+=j; j*=2; z++; } cout<<z<<endl; } return 0; }
C - Middle Class
对所有的数求和,判断平均能不能大于x,不可以就从最小的开始,去掉,再判断
int main() { ll k,n,m,i,j,z=0; cin>>k; while(k--){ ll a[100010]; cin>>n>>m; ll sum=0; for(i=0;i<n;i++){ cin>>a[i]; sum+=a[i]; } if(sum/n>=m){ cout<<n<<endl; }else{ sort(a,a+n); for(i=0;i<n-1;i++){ sum-=a[i]; if(sum/(n-i-1)>=m){ cout<<n-i-1<<endl; break; } } if(i==n-1){ cout<<0<<endl; } } } return 0; }
D - Circle of Monsters
找一个地方开头呗,前边那个就炸不着它了,看看哪浪费的最少呗
ll a[300005][2],b[300005]; int main() { ll k,n,m,i,j=0,minn=1e18; cin>>k; while(k--) { ll n,i,sum=0; minn=1e18; cin>>n; for(i=0;i<n;i++){ scanf("%lld%lld",&a[i][0],&a[i][1]); } for(i=0; i<n; i++) { if(i==0) { b[0]=max(0ll,a[0][0]-a[n-1][1]); } else{ b[i]=max(0ll,a[i][0]-a[i-1][1]); } sum+=b[i]; } for(i=0;i<n;i++){ minn=min(minn,sum-b[i]+a[i][0]); } printf("%lld ",minn); } return 0; }
E - Kind Anton
如果第二个序列的数比第一个序列同位上的数大,在此之前原序列得有1才行
如果第二个序列的数比第一个序列同位上的数小,在此之前原序列得有-1才行
ll a[100100]; int main() { int k,n,d,x,b,flag,i; cin>>k; while(k--){ cin>>n; for(i=0;i<n;i++){ cin>>a[i]; } d=0;x=0,flag=0; for(i=0;i<n;i++){ cin>>b; if(b>a[i]&&d==0&&flag==0){ cout<<"NO"<<endl; flag=1; } if(b<a[i]&&x==0&&flag==0){ cout<<"NO"<<endl; flag=1; } if(a[i]==1){ d=1; } if(a[i]==-1){ x=1; } } if(flag==0){ cout<<"YES"<<endl; } } return 0; }
F - Eugene and an array
(i,j)的子串和为零,前缀和sum[i]==sum[j]
(我没想出来QWQ)
map<ll,ll>vis; ll sum[200005]; int main() { int n,a; cin>>n; vis[0]=1; for(int i=1;i<=n;i++) { cin>>a; sum[i]=sum[i-1]+a; } ll s=0; int l=0,r=1; while(r<=n) { while(vis[sum[r]]) { vis[sum[l]]=0; l++; } vis[sum[r]]=1; s+=r-l; r++; } cout<<s<<endl; return 0; }
以上是关于2020-05-26 — 习题训练三的主要内容,如果未能解决你的问题,请参考以下文章