GCJ Round 1A 2016

来源:互联网 发布:独立游戏开发者 知乎 编辑:程序博客网 时间:2024/05/16 14:49

Problem A. The Last Word

给S ≤ 1000字符,每次可以插队头、队尾,求字典序最小的结果

    int T=read();    For(kcase,T) {        string s;        cin>>s;        int n=SI(s);        string ans;        Rep(i,n) {            if (ans+s[i]<s[i]+ans) ans=s[i]+ans;            else ans=ans+s[i];        }        printf("Case #%d: ",kcase);        cout<<ans<<endl;            }

Problem B. Rank and File

已知一个序列,每行/列从左至右(从上至下)严格递增,
现在已知2*n-1个不同的行/列的数列,求出缺失的那行/列

由于严格递增,只有缺失的那一行/列元素出现奇数次

    int T=read();    For(kcase,T) {        printf("Case #%d:",kcase);        cin>>n;        MEM(p)        For(i,2*n-1) {            For(j,n) p[read()]^=1;        }        For(i,2500) if (p[i]) cout<<' '<<i;cout<<endl;     } 

Problem C. BFFs

已知n个人,每个人都有一个最要好的人(不是自己),现在你希望让选出一些人排成一个圈,使得每个人都与最要好的人相邻。
问圈最长是多少?

分情况:要么最后是一个圈,要么是若干条链
对于每条链,他能单独拿出说明一定有一对人互相最要好
这里写图片描述

#include<bits/stdc++.h>using namespace std;#define For(i,n) for(int i=1;i<=n;i++)#define Fork(i,k,n) for(int i=k;i<=n;i++)#define Rep(i,n) for(int i=0;i<n;i++)#define ForD(i,n) for(int i=n;i;i--)#define ForkD(i,k,n) for(int i=n;i>=k;i--)#define RepD(i,n) for(int i=n;i>=0;i--)#define Forp(x) for(int p=Pre[x];p;p=Next[p])#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])  #define Lson (o<<1)#define Rson ((o<<1)+1)#define MEM(a) memset(a,0,sizeof(a));#define MEMI(a) memset(a,127,sizeof(a));#define MEMi(a) memset(a,128,sizeof(a));#define INF (2139062143)#define F (100000007)#define pb push_back#define mp make_pair #define fi first#define se second#define vi vector<int> #define pi pair<int,int>#define SI(a) ((a).size())#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;#define PRi2D(a,n,m) For(i,n) { \                        For(j,m-1) cout<<a[i][j]<<' ';\                        cout<<a[i][m]<<endl; \                        } typedef long long ll;typedef unsigned long long ull;ll mul(ll a,ll b){return (a*b)%F;}ll add(ll a,ll b){return (a+b)%F;}ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;}void upd(ll &a,ll b){a=(a%F+b%F)%F;}int read(){    int x=0,f=1; char ch=getchar();    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}    return x*f;} int n,a[1010];bool b[1010];bool b2[1010];int f[1010][1010],len[1010];vi G[1010];int dep[1010];int search(int u,int fa) {    b[u]=1;    int sz=SI(G[u]),d=1;    Rep(i,sz) {        int v=G[u][i];        if (v==fa) continue;        if (!b[v]) search(v,u);        d=max(d,dep[v]+1);    }    dep[u]=d;}int main(){    freopen("C.in","r",stdin);    freopen("C.out","w",stdout);    int T=read();    For(kcase,T) {        printf("Case #%d:",kcase);        n=read();        For(i,n) a[i]=read();        MEM(f)         MEM(b2)        int ans=0,lans=0;        For(i,n) {            MEM(b)            f[i][1]=i;            b[f[i][1]]=1;            for(int j=2;;j++) {                f[i][j]=a[f[i][j-1]];                if (b[f[i][j]]) {                    len[i]=j-1;                    if (f[i][j]!=f[i][j-2]&&f[i][j]!=f[i][1]) len[i]=0;                    if (f[i][j]==f[i][1]) {                        ans=max(ans,len[i]);                        if (len[i]==2) ;                    }                    break;                }                b2[f[i][j]]=b[f[i][j] ] =1;            }                   }        For(i,n) G[i].clear();        For(i,n) G[a[i]].pb(i);        MEM(b) MEM(dep)        For(i,n) {            if (i<a[i] && a[a[i]]==i) {                search(i,a[i]);                search(a[i],i);                lans+=dep[i]+dep[a[i]];            }        }        cout<<' '<<max(ans,lans);        cout<<endl;//      PRi2D(f,n,len[i])//      PRi(len,n)    }     return 0;}

暴力:

#include<bits/stdc++.h>using namespace std;#define For(i,n) for(int i=1;i<=n;i++)#define Fork(i,k,n) for(int i=k;i<=n;i++)#define Rep(i,n) for(int i=0;i<n;i++)#define ForD(i,n) for(int i=n;i;i--)#define ForkD(i,k,n) for(int i=n;i>=k;i--)#define RepD(i,n) for(int i=n;i>=0;i--)#define Forp(x) for(int p=Pre[x];p;p=Next[p])#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])  #define Lson (o<<1)#define Rson ((o<<1)+1)#define MEM(a) memset(a,0,sizeof(a));#define MEMI(a) memset(a,127,sizeof(a));#define MEMi(a) memset(a,128,sizeof(a));#define INF (2139062143)#define F (100000007)#define pb push_back#define mp make_pair #define fi first#define se second#define vi vector<int> #define pi pair<int,int>#define SI(a) ((a).size())#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;#define PRi2D(a,n,m) For(i,n) { \                        For(j,m-1) cout<<a[i][j]<<' ';\                        cout<<a[i][m]<<endl; \                        } typedef long long ll;typedef unsigned long long ull;ll mul(ll a,ll b){return (a*b)%F;}ll add(ll a,ll b){return (a+b)%F;}ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;}void upd(ll &a,ll b){a=(a%F+b%F)%F;}int read(){    int x=0,f=1; char ch=getchar();    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}    return x*f;} int n,a[1010];int t[1010];bool check(int m) {    For(i,m) {        int v1=i+1,v2=i-1;        if (v2==0) v2=m;        if (v1==m+1) v1=1;        if (a[t[i]]!=t[v1]&&a[t[i]]!=t[v2]) return 0;    }    return 1;}int main(){    freopen("C.in","r",stdin);    freopen("C2.out","w",stdout);    int T=read();    For(kcase,T) {        printf("Case #%d: ",kcase);        n=read();        For(i,n) a[i]=read();        int ans=0;        For(i,n) t[i]=i;        int p=1;        For(i,n) p*=i;        while(p--) {//          PRi(t,n)            Fork(i,2,n) if (check(i)) ans=max(ans,i);            next_permutation(t+1,t+1+n);        }        cout<<ans<<endl;    }       return 0;}
0 0
原创粉丝点击