Codeforces-Round#547(Div.3)-C-Polycarp Restores Permutation
阿新 • • 發佈:2019-04-18
避免 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