题目地址:http://pat.zju.edu.cn/contests/pat-a-practise
还是太弱。。
英文太差,,,
估计要等待被虐了。。
1077
找最长的公共后缀,暴力就可以写:
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #include<string> using namespace std; char a[105][1005]; int milen; void myreverse(char *s) { int len=strlen(s); milen=min(len,milen); for(int i=0; i<len/2; i++) { char tmp=s[i]; s[i]=s[len-1-i]; s[len-1-i]=tmp; } } int main() { int n,i,j; while(cin>>n) { gets(a[0]); milen=10005; for(i=0; i<n; i++) { gets(a[i]); myreverse(a[i]); } for(i=0; i<milen; i++) { int flag=0; for(j=1; j<n; j++) { if(a[j][i]!=a[0][i]) { flag=1; break; } } if(flag) break; } int p=i; char ans[1005]; for(i=0; i<p; i++) ans[i]=a[0][i]; ans[i]='\0'; myreverse(ans); if(p==0) puts("nai"); else printf("%s\n",ans); } return 0; } /* 3 Itai nyan~ Ninjin wa iyadanyan~ uhhh nyan~ 3 Itai! Ninjinnwaiyada T_T T_T */
1078:
hash散列啊,二次探测啊,单词看不懂。。
#include<cstdio> #include<cmath> #include<iostream> #include<cstring> #include<string> using namespace std; const int maxn=20005; int prim[maxn]; int mp[maxn]; int tmpprim[maxn]; int visi[maxn]; int ans[maxn]; void sxprim() { int i,j; memset(prim,1,sizeof(prim)); prim[1]=0; for(i=2;i<maxn;i++) { if(prim[i]) { for(j=i*2;j<maxn;j+=i) prim[j]=0; } } int cnt=0; for(i=maxn-1;i>=2;i--) { if(prim[i]) tmpprim[cnt++]=i; } for(i=0;i<cnt-1;i++) { int tmp=tmpprim[i]; int k=tmpprim[i+1]; for(j=tmp;j>k;j--) mp[j]=tmp; } for(j=1;j<=tmpprim[cnt-1];j++) mp[j]=tmpprim[cnt-1]; //for(i=1;i<=20;i++) //cout<<i<<" "<<mp[i]<<endl; } int main() { sxprim(); int mod,n,i; while(cin>>mod>>n) { mod=mp[mod]; //re-defined memset(visi,0,sizeof(visi)); for(i=0;i<n;i++) { int x; cin>>x; int cur=x%mod; if(!visi[cur]) { visi[cur]=1; ans[i]=cur; } else { int cnt=1; int flag=0; while(cnt<=maxn) //探测法都搞错了。。 { int p=(cnt*cnt+cur)%mod; if(!visi[p]) { visi[p]=1; ans[i]=p; flag=1; break; } cnt++; } if(!flag) ans[i]=-1; } } for(i=0;i<n;i++) { if(i) cout<<" "; if(ans[i]>=0) cout<<ans[i]; else cout<<"-"; } cout<<endl; } return 0; } /* 11 8 2 2 2 2 2 2 2 2 */
1079:
就是给你一颗树,找叶子结点,叶子结点有值,然后从根往下每一层会以r%增加。
不预处理会超时。。
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<string> #include<algorithm> #include<vector> const int maxn=100005; using namespace std; vector <int> mq[maxn]; int n; double p,r; /*double cal(int step) { double ans=p; for(int i=0; i<step; i++) ans=ans*(r/100.0+1.0); return ans; }*/ double tt[maxn]; void cal() //预处理之后就不会超时了,时间换空间 { tt[0]=p; for(int i=1;i<maxn;i++) tt[i]=tt[i-1]*(1.0+r/100.0); } int height[maxn]; double val[maxn]; double ans; void dfs(int cur) { int len=mq[cur].size(); int i; if(len==0) { ans+=val[cur]*tt[height[cur]]; return; } else { for(i=0;i<len;i++) { int p=mq[cur][i]; height[p]=height[cur]+1; dfs(p); } } } int main() { int i; while(cin>>n) { cin>>p>>r; cal(); for(i=0; i<n; i++) mq[i].clear(); height[0]=0; int x,chi; for(i=0; i<n; i++) { cin>>x; if(x) { while(x--) { cin>>chi; mq[i].push_back(chi); } } else { cin>>val[i]; } } ans=0; dfs(0); printf("%.1f\n",ans); } return 0; } /* 10 1.80 1.00 3 2 3 5 1 9 1 4 1 7 0 7 2 6 1 1 8 0 9 0 4 0 3 */
1080:
这个最后也只能拿24分/30分,有个错误,有个数据跑出来段错误。
我估计是数据是每个学校定额有0的情况。。不然错的没道理啊。。
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<string> #include<algorithm> #include<vector> #include<set> const int maxn=40005; using namespace std; int n,m,k; int peo[maxn]; //set <int> ans[maxn]; //set <int> ::iterator mq; vector <int> ans[105]; struct node { int index; int ge; int gi; int total; int aim[6]; }nod[maxn]; struct nodd { int ge; int gi; }last[105]; //暂存每个学校录取成绩最低的人,如果有相同成绩的也加进去 int cmp(node p1,node p2) { if(p1.total>p2.total) return 1; else if(p1.total==p2.total&&p1.ge>p2.ge) return 1; //else if(p1.total==p2.total&&p1.ge==p2.ge&&p1.gi>p2.gi) return 1; return 0; } int main() { int i,j; int a[10]; while(cin>>n>>m>>k) { for(i=0;i<n;i++) ans[i].clear(); for(i=0;i<m;i++) cin>>peo[i]; for(i=0;i<n;i++) { cin>>nod[i].ge>>nod[i].gi; for(j=0;j<k;j++) cin>>nod[i].aim[j]; nod[i].total=nod[i].ge+nod[i].gi; nod[i].index=i; } sort(nod,nod+n,cmp); for(i=0;i<n;i++) { for(j=0;j<m;j++) a[j]=nod[i].aim[j]; for(j=0;j<m;j++) { if(peo[a[j]]) { peo[a[j]]--; ans[a[j]].push_back(nod[i].index); if(peo[a[j]]==0) { last[a[j]].ge=nod[i].ge; last[a[j]].gi=nod[i].gi; } break; } else { if(nod[i].ge==last[a[j]].ge&&nod[i].gi==last[a[j]].gi) { ans[a[j]].push_back(nod[i].index); break; } } } } for(i=0;i<m;i++) { if(ans[i].size()==0) puts(""); else { int len=ans[i].size(); sort(ans[i].begin(),ans[i].end()); /*mq=ans[i].begin(); int flag=0; for(;mq!=ans[i].end();mq++) { if(flag) cout<<" "; else flag=1; cout<<*mq; }*/ for(j=0;j<len;j++) { if(j>0) cout<<" "; cout<<ans[i][j]; } cout<<endl; } } } return 0; } /* 11 6 3 2 1 2 2 2 3 100 100 0 1 2 60 60 2 3 5 100 90 0 3 4 90 100 1 2 0 90 90 5 1 3 80 90 1 0 2 80 80 0 1 2 80 80 0 1 2 80 70 1 3 2 70 80 1 2 3 100 100 0 2 4 */