https://codeforces.com/contest/1174
A:
题意:重新排列2n个数,使得前面n个的sum不等于后面n个的sum。
思路:sort使得达到最坏情况
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int MX = 1e6+5;
int a[5000];
int main(){
int n;scanf("%d",&n);for(int i=1;i<=n*2;i++)scanf("%d",&a[i]);
sort(a+1,a+1+n*2);int sa=0,sb=0;
for(int i=1;i<=n;i++) sa+=a[i],sb+=a[i+n];
if(sa==sb){puts("-1");return 0;}
for(int i=1;i<=2*n;i++)printf("%d ",a[i]);
return 0;
}
B:
题意:给一个数列,每次可以交换和为奇数的两位数,求可以得到的最小字典序的序列。
思路:如果奇偶数都有,那么sort即可,否则不变。
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int MX = 1e6+5;
int a[MX];
int main(){
int tagodd=0,tageven=0;
int n;scanf("%d",&n);for(int i=1;i<=n;i++){
scanf("%d",&a[i]);if(a[i]%2==0)tageven=1;
if(a[i]%2==1)tagodd=1;
}
if(tagodd+tageven==1){
for(int i=1;i<=n;i++)printf("%d ",a[i]);
return 0;
}
sort(a+1,a+1+n);
for(int i=1;i<=n;i++)printf("%d ",a[i]);
return 0;
}
C:
题意:构造n个数的数列,使得任何两个数要么相同,要么gcd==1,且这个数列的最大值最小。
思路:有因子2的相同,有因子3的相同。
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int MX = 1e6+5;
int vis[MX],ans[MX];
map<int,int>mp;
int main(){
int n;cin>>n;
for(int i=2;i<=n;i++){
if(vis[i])continue;
for(int j=i+i;j<=n;j=j+i){
if(mp[j]==0)
mp[j]=i;
vis[j]=1;
}
}
int mx=1;ans[2]=1;printf("%d ",1);
for(int i=3;i<=n;i++){
if(vis[i]==0){mx++;printf("%d ",mx);ans[i]=mx;}
else {printf("%d ",ans[mp[i]]),ans[i]=ans[mp[i]];}
}
return 0;
}
D:https://blog.csdn.net/qq_41730604/article/details/90771268
E:https://blog.csdn.net/qq_41730604/article/details/95100387
F:https://blog.csdn.net/qq_41730604/article/details/95002334