codeforces竞赛|Codeforces Round #810 (Div. 2)【比赛记录】

A. Perfect Permutation n为偶数的话,i~i+1两两交换位置即可;
n为奇数的话,不管怎么交换,一定会有一个满足整除条件,故第一个数不动,后面偶数个两两交换即可!!!

#include using namespace std; #define sc(x) scanf("%d",&x) #define sl(x) scanf("%lld",&x) #define ll long long #define pb push_back #define INF 0x3f3f3f3f #define eps 1e-8 const int Max=2e5+5; int main(){ int t; sc(t); while(t--){ int n; sc(n); if(n%2==1){ printf("1 "); for(int i=2; i<=n; i+=2){ printf("%d %d ",i+1,i); } }else{ for(int i=1; i<=n; i+=2){ printf("%d %d ",i+1,i); } } printf("\n"); } }

B. Party 这题比赛的时候看题看半小时,罚坐半小时,好奇怪的解法,第一次见!!!掉分,T_T
m如果为偶数个,全选就行,答案为0!!!
【codeforces竞赛|Codeforces Round #810 (Div. 2)【比赛记录】】m如果为奇数个,要使得邀请的人越多越好,故不邀请一个人有偶数个关系,剩下全邀请即可,这时候有可能全部都有奇数个关系,所以这时候就不是最优情况,故还需要考虑不邀请一对朋友中,除彼此之外加起来有偶数个关系!!!
#include using namespace std; #define sc(x) scanf("%d",&x) #define sl(x) scanf("%lld",&x) #define ll long long #define pb push_back #define INF 0x3f3f3f3f #define eps 1e-8 const int Max=2e5+5; int a[Max],sum[Max]; pair mp[Max]; int main(){ int t; sc(t); while(t--){ int n; int m; sc(n); sc(m); for(int i=1; i<=n; i++) sc(a[i]),sum[i]=0; int ans=1e9+5; for(int i=1; i<=m; i++){ int u,v; sc(u); sc(v); sum[u]++; sum[v]++; mp[i]=make_pair(u,v); } if(m%2==0) printf("0\n"); else{ for(int i=1; i<=n; i++){ if(sum[i]%2) ans=min(ans,a[i]); } for(int i=1; i<=m; i++){ if((sum[mp[i].first]+sum[mp[i].second])%2==0){ ans=min(ans,a[mp[i].first]+a[mp[i].second]); } } printf("%d\n",ans); } } }

C. Color the Picture 这题本来可以出的,都错题了!!!
有两种情况,一种是竖着放最优,如样例,还一种是横着放最优,每每放一种颜色注意行数或者列数要>=2,从小到大贪心放就行!!!
#include using namespace std; #define sc(x) scanf("%d",&x) #define sl(x) scanf("%lld",&x) #define ll long long #define pb push_back #define INF 0x3f3f3f3f #define eps 1e-8 const int Max=2e5+5; ll a[Max]; int main(){ int t; sc(t); while(t--){ ll n,m,k; sl(n); sl(m); sl(k); for(int i=1; i<=k; i++){ sl(a[i]); } bool flag=false; ll ans=0; sort(a+1,a+1+k); for(int i=1; i<=k; i++){ if(a[i]/n>=2){ if((m-(ans+a[i]/n))==1){ if(a[i]/n>2) ans+=(a[i]/n-1); } else ans+=a[i]/n; } } if(ans>=m){ printf("YES\n"); continue; } ans=0; for(int i=1; i<=k; i++){ if(a[i]/m>=2){ if((n-(ans+a[i]/m))==1){ if(a[i]/m>2) ans+=(a[i]/m-1); } else ans+=a[i]/m; } } if(ans>=n){ printf("YES\n"); continue; }else printf("NO\n"); } }

糟糕透顶,掉分场,貌似自己没有打好过一次!!!!!!!能出的没出

    推荐阅读