A. Perfect Permutation
n为偶数的话,i~i+1两两交换位置即可;
n为奇数的话,不管怎么交换,一定会有一个满足整除条件,故第一个数不动,后面偶数个两两交换即可!!!
#include <bits/stdc++.h>
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!!!
m如果为奇数个,要使得邀请的人越多越好,故不邀请一个人有偶数个关系,剩下全邀请即可,这时候有可能全部都有奇数个关系,所以这时候就不是最优情况,故还需要考虑不邀请一对朋友中,除彼此之外加起来有偶数个关系!!!
#include <bits/stdc++.h>
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<int,int> 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 <bits/stdc++.h>
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");
}
}
糟糕透顶,掉分场,貌似自己没有打好过一次!!!!!!!能出的没出