A题 将n个数分成两部分,只要将2的n次方和2的1次方 到2的(n/2)-1次方加起来,剩下的加起来,在做差就可以。,代码:
#include<bits/stdc++.h> using namespace std; int main() { int t; cin>>t; while(t--) { int n; cin>>n; long long ans1=0,ans2=0,num=1; for(int i=1;i<=n;i++) { num=num*2; if(i<n/2||i==n)ans1+=num; else ans2+=num; } cout<<abs(ans1-ans2)<<endl; } }
B题 先判断n个数中有多少个不同的数,如果不同数的个数大于k就不可以,否则就输出n组有k个不同数的相同序列,其中不同的数要包含已有的数,剩余的在小于n的数里面选就可以。
#include<bits/stdc++.h> using namespace std; int main() { int t; cin>>t; while(t--) { int n,m; cin>>n>>m; set<int>p; vector<int>q; q.clear(); p.clear(); for(int i=1;i<=n;i++)q.push_back(i); for(int i=0;i<n;i++) { int a; cin>>a; p.insert(a); } int l=p.size(); if(l>m) { cout<<-1<<endl; } else { int y=n; cout<<n*m<<endl; for(int i=0;i<n;i++) { if(p.find(q[i])!=p.end()) { q.erase(q.begin()+i); i--; n--; } } while(y--) { for (set<int>::iterator it = p.begin(); it != p.end(); ++it)printf("%d ", *it); for(int i=0;i<m-l;i++)cout<<q[i]<<" "; } cout<<endl; } } }
C题如果2*a<=b,就最少需要(x+y)*a,否则就需要min(x,y)个b,和max(x,y)-min(x,y)个a。
#include<bits/stdc++.h> using namespace std; #define LL long long int main() { int t; cin>>t; while(t--) { LL c,d; cin>>c>>d; LL a,b; cin>>a>>b; LL ans=0; if(a*2<=b||c*d<=0) { ans=(abs(c)+abs(d))*a; } else { if(c<0)c=c*-1; if(d<0)d=d*-1; if(c>0&&d>0)ans=min(c,d)*b+(max(c,d)-min(c,d))*a; } cout<<ans<<endl; } }
D题如果只包含0或1就输出原来的字符串,不然就输出字符串长度个01;
#include<bits/stdc++.h> using namespace std; int main() { int t; cin>>t; while(t--) { string s; cin>>s; int l=s.length(); int flag=0; for(int i=0;i<l;i++) { if(s[i]==‘0‘) { if(flag==0||flag==1)flag=1; else { flag=3; break; } } if(s[i]==‘1‘) { if(flag==0||flag==2)flag=2; else { flag=3; break; } } } if(flag==2||flag==1||flag==0)cout<<s<<endl; else { for(int i=0;i<l;i++)cout<<"01"; cout<<endl; } } }
E题判断下都是最小的质量能不能小于最大的范围,以及最大的质量能不能大于最小的范围。
#include<bits/stdc++.h> using namespace std; int main() { int t; cin>>t; while(t--) { int n,a,b,c,d; cin>>n>>a>>b>>c>>d; if((a-b)*n<=c+d&&(a+b)*n>=c-d)cout<<"Yes"<<endl; else cout<<"No"<<endl; } }
F题,先预处理对于山峰定义为1,不是山峰就是0,然后利用类似滑动窗口的东西,求出除窗口边上两个元素其余和的最大的一组,最大的那组的和+1就是可以分割的数量。
#include<bits/stdc++.h> using namespace std; int main() { int t; cin>>t; while(t--) { int n,m; cin>>n>>m; int a[200005],b[200005]; int sum=0; for(int i=1;i<=n;i++) { cin>>a[i]; } b[1]=0,b[n]=0; for(int i=2;i<n;i++) { if(a[i]>a[i-1]&&a[i]>a[i+1])b[i]=1; else b[i]=0; if(i<m)sum+=b[i]; } int ans=1; int num=sum; for(int i=2;i<=n-m+1;i++) { num=num-b[i]+b[m+i-2]; if(num>sum) { ans=i; sum=num; } } cout<<sum+1<<" "<<ans<<endl; } }
原文:https://www.cnblogs.com/Kingstar1/p/12917909.html