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");
}
}
糟糕透顶,掉分场,貌似自己没有打好过一次!!!!!!!能出的没出
推荐阅读
- ccpc|The 2021 CCPC Weihai Onsite E. CHASE!
- 树上dp|树的最小支配集和最小点覆盖
- 牛客竞赛|牛客挑战赛59 B 游戏【dp】
- java|计算平均成绩【JAVA】
- 游戏|看完这个即便你是菜鸟你也会用C语言实现三子棋
- 算法|SSH人脸检测算法(SSH: Single Stage Headless Face Detector)
- c++|基于C++的OpenCV(八)图像处理
- c++|C++入门——类、对象、运算符重载
- 算法习题|[leetcode] 138.复制带随机指针的链表(C语言)