2020-05-26 — 习题训练 题解
Posted kingstar1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2020-05-26 — 习题训练 题解相关的知识,希望对你有一定的参考价值。
A题,要想前面的差小于后面的,只要排一下序然后先输出中间的,在输出前一个,在输出后一个,然后一直一前一后输出就可以了。
#include<bits/stdc++.h> using namespace std; #define LL long long int main() { int t; cin>>t; while(t--) { int n; cin>>n; vector<LL>p; p.clear(); for(int i=0;i<n;i++) { LL a; cin>>a; p.push_back(a); } sort(p.begin(),p.begin()+n); int num1=n/2-1+1,num2=n/2-1-1; cout<<p[(n-1)/2]<<" "; if(n%2==1) { num1=n/2+1,num2=n/2-1; } int num=1,num3=p[n/2]; while(num<n) { if(num%2==1) { cout<<p[num1]<<" "; num1++; } else { cout<<p[num2]<<" "; num2--; } num++; } cout<<endl; } }
B题,先算出第i秒增加多少,根据题意前面的一定比后面的大,贪心的从前往后比较,记录最大值与后面的比较,记录最少需要的秒数
#include<bits/stdc++.h> using namespace std; #define LL long long LL a[40]; int main() { int t; cin>>t; a[0]=0; for(int i=1;i<=35;i++) { a[i]=(a[i-1]+1)*2-1; } while(t--) { int n; cin>>n; LL num1=0,num2=0,ans=0; cin>>num1; for(int i=1;i<n;i++) { LL b; cin>>b; if(b>=num1) { num1=b; } else { for(int i=1;i<35;i++) { if(b+a[i]>=num1) { num2=i; if(num2>ans)ans=num2; break; } } } } cout<<ans<<endl; } }
C题,先排序,从最大的那边向后求平均值,直到小于最少财富。
#include<bits/stdc++.h> using namespace std; #define LL long long int main() { int t; cin>>t; while(t--) { int n,x; cin>>n>>x; LL a[100005]; for(int i=0;i<n;i++) { cin>>a[i]; } sort(a,a+n); LL num=0,num2=0,ans=0; for(int i=n-1;i>=0;i--) { num2++; num+=a[i]; if(num/num2<x) { break; } else ans=num2; } cout<<ans<<endl; } }
D题,先根据所有的怪物会被前一个炸多少血算出剩余需要花费的数量,然后从前向后遍历一遍,算出每一个需要的数量,就是需要花费的数量减去前一个炸掉的加上这个怪物本来的血量,取最小值即可。
#include<bits/stdc++.h> using namespace std; #define LL long long LL a[300005],b[300005],c[300005]; int main() { int t; cin>>t; while(t--) { int n; cin>>n; LL max=0,num=0,ans=1e18; for(int i=0;i<n;i++) { scanf("%lld%lld",&a[i],&b[i]); if(i!=0) { if(a[i]>=b[i-1]) { c[i]=a[i]-b[i-1]; } else c[i]=0; num+=c[i]; } } if(a[0]>=b[n-1])c[0]=a[0]-b[n-1]; else c[0]=0; num+=c[0]; for(int i=0;i<n;i++) { max=num-c[i]+a[i]; if(max<ans)ans=max; } cout<<ans<<endl; } }
E题,统计第一个数组中1的数量和-1的数量,然后让第二个数组从后向前遍历,如果ai>0一的数量减一个,小于0 ,-1的数量建一个,然后如果bi>ai就看1的个数,小于就看-1的个数。
#include<bits/stdc++.h> using namespace std; #define LL long long LL a[100005],b[100005]; int main() { int t; cin>>t; while(t--) { int n; cin>>n; LL num1=0,num2=0,flag=0; for(int i=0;i<n;i++) { cin>>a[i]; if(a[i]<0)num1++; if(a[i]>0)num2++; } for(int i=0;i<n;i++) { cin>>b[i]; } for(int i=n-1;i>=0;i--) { if(a[i]==1)num2--; if(a[i]==-1)num1--; if(b[i]<a[i]&&num1==0||b[i]>a[i]&&num2==0) { flag=1; break; } } if(flag==0)cout<<"YES"<<endl; else cout<<"NO"<<endl; } }
以上是关于2020-05-26 — 习题训练 题解的主要内容,如果未能解决你的问题,请参考以下文章