1. 程式人生 > >Codeforces-Round#547(Div.3)-C-Polycarp Restores Permutation

Codeforces-Round#547(Div.3)-C-Polycarp Restores Permutation

避免 spa %d ret ++ sca string == tor

這個題做的真是慘,場上寫出了各種bugQAQ。

有一個註意的地方是數據會爆int。

兩種做法,第一種假設第一個數是x,那麽依次可推出後面的數,然後求和(和為(1+n)*n/2)解得x。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>

using namespace std;
const int maxn=2e5+10;
typedef long long int ll;
ll n;
ll arr[maxn];
int vis[maxn];

bool Judge(ll x){
    vis[x]=1;
    for(int i=1;i<n;i++){
        x+=arr[i];
        if(x>n || x<1 || vis[x]) return false ;
        vis[x]=1;
    }
    return true ;
}

int main()
{
    while(scanf("%I64d",&n)!=EOF){
        ll sum=0,ans=0,a;
        memset(vis,0,sizeof(vis));
        for(int i=1;i<n;i++){
            scanf("%I64d",&a);
            arr[i]=a;
            sum+=a;
            ans+=sum;
        }
        ll cnt=(1+n)*n/2;
        cnt-=ans;
        if(cnt%n==0){
            ll x=cnt/n;
            if((x>=1 && x<=n) && Judge(x)){
                printf("%I64d ",x);
                for(int i=1;i<n;i++){
                    x+=arr[i];
                    printf("%I64d%c",x,i==n-1?‘\n‘:‘ ‘);
                }
            }else printf("-1\n");
        }else printf("-1\n");
    }
    return 0;
}

第二種是隨便設第一個數為已知數,然後根據輸入遞推後面的數,找出其中最小的,然後使其變成1即可。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>

using namespace std;

const int maxn=(100000<<1)+5;//這個地方加括號
int n,x;
int arr[maxn],vis[maxn];

int main(){
    scanf("%d",&n);
    arr[1]=1;
    int num=1,minnum=1;
    for(int i=2;i<=n;i++){
        scanf("%d",&x);
        num+=x;
        minnum=min(minnum,num);
        arr[i]=num;
    }
    int cnt=1-minnum;
    for(int i=1;i<=n;i++){
        arr[i]+=cnt;
        if(arr[i]<1 || arr[i]>n || vis[arr[i]]){//這個地方要先判斷是否構成排列來避免爆int
            printf("-1\n");
            return 0;
        }
        vis[arr[i]]=1;
    }
    for(int i=1;i<=n;i++)
        printf("%d%c",arr[i],i==n?‘\n‘:‘ ‘);
    return 0;
}

Codeforces-Round#547(Div.3)-C-Polycarp Restores Permutation