1. 程式人生 > >Atcoder Grand Contest 032

Atcoder Grand Contest 032

tps neighbour for 可能 簽到 pac task make printf

打的第一場Atcoder,已經知道會被虐得很慘,但沒有想到竟然只做出一題……

思維急需提升。

A - Limited Insertion

這題還是很簽到的。

感覺正著做不好做,我們反著來,把加數變為刪數。

顯然每次有多個可以刪時要刪最後一個可刪的,這樣前面仍然合法,後面也有可能有更多合法情況。

發現不能刪時就puts("-1")

#include<bits/stdc++.h>
namespace my_std{
    using namespace std;
    #define rep(i,x,y) for (int i=(x);i<=(y);i++)
    #define drep(i,x,y) for (int i=(x);i>=(y);i--)
    #define sz 233
}
using namespace my_std;

int n;
vector<int>v;
int ans[sz];

int main()
{
    cin>>n;
    int x;
    rep(i,1,n) cin>>x,v.push_back(x);
    drep(i,n,1)
    {
        bool flg=0;
        drep(j,i-1,0) if (v[j]==j+1) {flg=1;ans[i]=j+1;v.erase(v.begin()+j);break;}
        if (!flg) return puts("-1"),0;
    }
    rep(i,1,n) printf("%d\n",ans[i]);
    return 0;
}

B - Balanced Neighbours

首先手玩出n=3,4,5的情況。

觀察一下圖,發現\(n=3\)\((1,2)\)未連邊,\(n=4\)\((1,4),(2,3)\)未連邊,\(n=5\)\((1,4),(2,3)\)未連邊。

\(1+2=3,1+4=2+3=5\)

猜一下結論,發現很容易證明,就做完了。

#include<bits/stdc++.h>
namespace my_std{
    using namespace std;
    #define pii pair<int,int>
    #define fir first
    #define sec second
    #define MP make_pair
    #define rep(i,x,y) for (int i=(x);i<=(y);i++)
}
using namespace my_std;

int main()
{
    int n;
    cin>>n;
    vector<pii>v;
    rep(i,1,n) rep(j,i+1,n) if (i+j!=n+(!(n&1))) v.push_back(MP(i,j));
    printf("%d\n",(int)v.size());
    rep(i,0,(int)v.size()-1) printf("%d %d\n",v[i].fir,v[i].sec);
    return 0;
}

CDEF還沒看題解,我還是先睡覺吧。

Atcoder Grand Contest 032