A 题:https://vjudge.net/problem/CodeForces-1339B/origin
题意:将给的数组排序 |a1−a2|≤|a2−a3|≤…≤|an−1−an|
解法:每次找一个最大值,一个最小值。
#include<iostream> #include<cstdio> #include<set> #include<queue> #include<stack> #include<vector> #include<bitset> #include<cstring> #include<string> #include<algorithm> using namespace std; typedef long long ll; const int MAXN=1e5+10; int main(){ int t; cin>>t; while(t--){ int n, a[MAXN], in[MAXN], res[MAXN]; int index=0; cin>>n; memset(res,1,sizeof(in)); for(int i =1;i<=n;i++){ scanf("%d",&a[i]); } sort(a+1,a+n+1); int l=1,r=n; int flag=0; while(l<=r){ if(flag){ in[index++]=a[l]; flag=0; l++; } else{ in[index++]=a[r]; flag=1; r--; } } for(int i = index-1;i>=0;i--) { if(i!=index-1) cout<<" "; cout<<in[i]; } cout<<endl; } return 0; }
C 题:https://vjudge.net/problem/CodeForces-1334B/origin
题意:判断是否可以每次将两个元素平均分,然后是否可以可以有k个富人。
解法:排序,从大向小判断,直到小于指定钱数。
#include<iostream> #include<cstdio> #include<set> #include<queue> #include<stack> #include<vector> #include<bitset> #include<cstring> #include<string> #include<algorithm> using namespace std; typedef long long ll; const int MAXN=1e5+10; ll a[MAXN]; int main(){ int t; cin>>t; while(t--){ int n,k; cin>>n>>k; for(int i =1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+1+n); ll Sum=0,ans=0; for(int i =n;i>=1;i--){ Sum+=a[i]; if(Sum/(n-i+1)>=k){ ans=n-i+1; continue; } else break; } cout<<ans<<endl; } return 0; }
D 题:https://vjudge.net/problem/CodeForces-1334C/origin
题意:当一个元素小于等于0时,爆炸会将下一个元素减去自己的爆炸伤害,为n时炸1.
解法:先求所有的血量减去前一个的爆炸伤害(小于0的为0)的和,然后枚举判断最小值。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN=3e5+10; struct book{ ll a,b,c; }g[MAXN]; ll tmp[MAXN]; int main(){ int t;ll d=0; cin>>t; while(t--){ ll n,ss=0; cin>>n; for(int i =0;i<n;i++){ scanf("%lld",&g[i].a); scanf("%lld",&g[i].b); if(i!=0){ g[i].c=max(g[i].a-g[i-1].b, d); ss+=g[i].c; } } g[0].c=max(g[0].a-g[n-1].b, d); ss+=g[0].c; for(int i=0;i<n;i++){ tmp[i]=ss; tmp[i]-=g[i].c; tmp[i]+=g[i].a; } sort(tmp,tmp+n); cout<<tmp[0]<<endl; } return 0; }
E 题:https://vjudge.net/problem/CodeForces-1333B/origin
题意:a数组是否可以变成b。对于变化:只能时a数组索引较小的才能加到后面的元素上。
解法:思维题,第一项一定相等,小的时候判断前面是否有1,大的时候判断前面是否有-1。
#include<iostream> #include<cstdio> #include<set> #include<queue> #include<stack> #include<vector> #include<bitset> #include<cstring> #include<string> #include<algorithm> using namespace std; typedef long long ll; const int MAXN=1e5+10; int a[MAXN], b[MAXN], res[MAXN]; int main(){ int t; cin>>t; while(t--){ int n; cin>>n; for(int i = 1;i<=n;i++){ scanf("%d",&a[i]); // cout<<a[i]<<endl; } int flag=1,flagf=0,flag1=0; for(int i = 1;i<=n;i++){ scanf("%d",&b[i]); } // cout<<"one: "<<one<<"fone: "<<fone<<"gz: "<<gz<<"dz: "<<dz<<"f1: "<<f1<<"f2: "<<f2<<endl; if(a[1]!=b[1]){ cout<<"NO"<<endl; continue; } int tmp=1; for(int i=1;i<=n;i++){ if(a[i]!=b[i]){ if(a[i]<b[i]){ if(!flag1){ cout<<"NO"<<endl; tmp=0; break; } } else{ if(!flagf){ cout<<"NO"<<endl; tmp=0; break; } } } if(a[i]==1){ flag1=1; } if(a[i]==-1){ flagf=1; } } if(tmp) cout<<"YES"<<endl; } return 0; }
原文:https://www.cnblogs.com/aixiaodezsh/p/12992081.html