原文链接https://www.cnblogs.com/zhouzhendong/p/AtCoder-Grand-Contest-from-1-to-10.html

 

考虑到博客内容较多,编辑不方便的情况,我决定把做题小记拆开写。

题解中的低级错误请指出,但是由于这里写的都是简要题解,所以具体细节就不要问我了。

 

咕咕咕

AGC009E

突然发现 AGC001F 怎么没做

 

AGC001

D  出现奇数的个数大于2时一定无解(构造图,从图的连通性方面考虑)。然后,如果有奇数,把他们放到头尾,然后 b 数组就是 a 数组的基础上,b[1]++,b[m]-- 。注意一些特殊情况要分讨。

Code

AtCoder Grand Contest 1~10 做题小记
#include <bits/stdc++.h>
using namespace std;
const int M=105;
int n,m,a[M],b[M];
bool cmp(int a,int b){
    return (a&1)>(b&1);
}
int main(){
    scanf("%d%d",&n,&m);
    for (int i=1;i<=m;i++)
        scanf("%d",&a[i]);
    if (m==1){
        if (a[1]==1)
            printf("%d \n%d\n%d",a[1],1,a[1]);
        else
            printf("%d \n%d\n%d %d",a[1],2,a[1]-1,1);
        return 0;
    }
    int t=0;
    for (int i=1;i<=m;i++)
        t+=a[i]&1;
    if (t>2)
        return puts("Impossible"),0;
    sort(a+1,a+m+1,cmp);
    if (a[2]&1)
        swap(a[2],a[m]);
    for (int i=1;i<=m;i++)
        b[i]=a[i];
    int _m=m;
    b[1]++,b[m]--;
    if (b[m]==0)
        _m--;
    for (int i=1;i<=m;i++)
        printf("%d ",a[i]);
    puts("");
    printf("%d\n",_m);
    for (int i=1;i<=_m;i++)
        printf("%d ",b[i]);
    return 0;
}
AGC001D

相关文章: