此题为找规律。期望100 实际100
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; long long len1,len2; long long n,s1,t1,s2,t2; long long abss(long long x){ if(x<0) return -x; else return x; } long long maxx(long long x,long long y){ if(x>y) return x; else return y; } int main(){ freopen("grid.in","r",stdin); freopen("grid.out","w",stdout); cin>>n>>s1>>t1>>s2>>t2; len1=abss(s1-s2);len2=abss(t1-t2); cout<<maxx(len1,len2)<<endl; }
期望20~40 实际20 感觉第二部分的部分分可以枚举所有可行的字符串,然后判断是否可行,但是炸掉了。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int T,type,n,tot,num; char s[50010]; string ans[130000]; void dfs(int be,string sbef){ string smid; for(int i=be;i>=3;i--){ smid+=s[i]; int lenn=smid.length(); if(type==0){ if(smid!=sbef) if(smid.length()==2||smid.length()==3){ ans[++num]=smid; dfs(i-1,smid); } } else{ if(smid.length()==2||smid.length()==3){ ans[++num]=smid; dfs(i-1,smid); } } if(smid.length()>3) break; } } int main(){ freopen("ling.in","r",stdin); freopen("ling.out","w",stdout); scanf("%d%d",&T,&type); while(T--){ cin>>s; int len=strlen(s); if(len<=20){ dfs(len-1,"abcd"); for(int i=1;i<=num;i++){ int lenn=ans[i].length(); string simm=ans[i]; for(int j=0;j<lenn;j++) ans[i][j]=simm[lenn-j-1]; } sort(ans+1,ans+1+num); for(int i=1;i<=num;i++) if(ans[i]!=ans[i-1]) tot++; cout<<tot<<endl; for(int i=1;i<=num;i++) if(ans[i]!=ans[i-1]) cout<<ans[i]<<endl; num=0;tot=0; } else if(type==1){ for(int i=len-1;i>=3;i-=3){ string smid; for(int j=i;j>=3;j--){ smid+=s[j]; if(i-j==2||i-j==1) ans[++num]=smid; if(i-j>2) break; } } for(int i=len-1;i>=3;i-=2){ string smid; for(int j=i;j>=3;j--){ smid+=s[j]; if(i-j==2||i-j==1) ans[++num]=smid; if(i-j>2) break; } } for(int i=1;i<=num;i++){ int lenn=ans[i].length(); string simm=ans[i]; for(int j=0;j<lenn;j++) ans[i][j]=simm[lenn-j-1]; } sort(ans+1,ans+1+num); for(int i=1;i<=num;i++) if(ans[i]!=ans[i-1]) tot++; cout<<tot<<endl; for(int i=1;i<=num;i++) if(ans[i]!=ans[i-1]) cout<<ans[i]<<endl; num=0;tot=0; } } }
期望10 实际10
也就只会写他是条链的暴力了。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int T,q,num=1,tot,deepmax; long double ans; int son[500010],deep[500010]; int to[500010],net[500010],head[500010]; void add(int u,int v){ to[++tot]=v;net[tot]=head[u];head[u]=tot; } long double pow(long double x,int num){ long double bns=x; for(int i=1;i<num;i++) bns*=x; return bns; } void work(int now,int de){ for(int i=head[now];i;i=net[i]){ deep[de]+=son[to[i]]; deepmax=(deepmax,de); work(to[i],de+1); } } int main(){ freopen("threebody.in","r",stdin); freopen("threebody.out","w",stdout); scanf("%d%d",&T,&q); if(q>2000&&q<=3000){ for(int i=1;i<=q;i++){ int x,y; scanf("%d%d",&x,&y); if(x==1) num++; else if(x==2){ for(int j=0;j<num-y;j++) ans+=pow(0.5,j+1)*j; ans+=pow(0.5,num-y)*(num-y); printf("%.10lf\n",double(ans)); } ans=0; } } else{ for(int i=1;i<=q;i++){ int x,y; scanf("%d%d",&x,&y); if(x==1){ num++;son[y]++; add(y,num); } else if(x==2){ deep[1]=son[y]; work(y,2); /*for(int j=1;j<=deepmax;j++) cout<<deep[i]<<" ";cout<<endl;*/ for(int j=1;j<=deepmax;j++){ long double bns=1.0; for(int k=1;k<=j;k++) bns=bns*(1-pow(0.5,deep[k])); bns=bns*pow(0.5,deep[j+1]); ans+=bns*j; } printf("%.10lf\n",double(ans)); ans=0; } } } } /* 0 6 2 1 1 1 1 2 1 3 1 4 2 1 */