2016年天梯赛模拟题集
L1:
-
⚠️ 这是一个错误代码。始终有一个样例过不了,我是铁飞舞
#include<iostream> #include<vector> #include<cmath> using namespace std; int n,numerator=0,denominator=1; typedef long long ll; struct node{ ll x,y; }; char ch; vector<node> a(101); int gcd(int a,int b) {return b>0 ? gcd(b,a%b):a;} int main() { cin>>n; for(int i=0;i<n;i++) { cin>>a[i].x>>ch>>a[i].y; denominator*=a[i].y; } for(int i=0;i<n;i++) { int temp=a[i].x; for(int j=0;j<n;j++) { if(i!=j) temp*=a[j].y; } numerator+=temp; } if(numerator==0) { cout<<0<<endl; } else if(numerator%denominator==0) { cout<<numerator/denominator<<endl; } else { if(abs(numerator/denominator)>=1) { int integer=numerator/denominator; int remain=numerator%denominator; int temp=gcd(abs(remain),abs(denominator)); cout<<integer<<" "<<remain/temp<<"/"<<denominator/temp<<endl; } else { int temp=gcd(abs(numerator),abs(denominator)); cout<<numerator/temp<<"/"<<denominator/temp<<endl; } } return 0; }
-
#include<iostream> #include<algorithm> using namespace std; int a[3],x; int main() { for(int i=1;i<=3;i++) cin>>a[i]; sort(a+1,a+4); for(int i=1;i<=3;i++) { cout<<a[i]; if(i!=3) cout<<"->"; } return 0; }
-
vis 数据记录第二个字符串出现的位置
#include<iostream> using namespace std; string s1,s2; int vis[1001]; int main() { getline(cin,s1); getline(cin,s2); for(int i=0;i<s2.size();i++) vis[s2[i]]=1; for(int i=0;i<s1.size();i++) if(!vis[s1[i]]) cout<<s1[i]; return 0; }
-
#include<iostream> #include<cmath> using namespace std; int n; int main() { cin>>n; int ans=pow(2,n); printf("2^%d = %d",n,ans); return 0; }
-
#include<iostream> #include<cmath> using namespace std; int n; int f(int n) { int ans=1; for(int i=1;i<=n;i++) ans*=i; return ans; } int main() { cin>>n; int res=0; for(int i=1;i<=n;i++) res+=f(i); cout<<res<<endl; return 0; }
-
#include<iostream> #include<cmath> using namespace std; int n; int main() { cout<<"This is a simple problem."<<endl; return 0; }
-
#include<iostream> using namespace std; int n; char ch; int main() { cin>>n>>ch; int col=n,row; if(n%2==0) row=col/2; else row=col/2+1; for(int i=0;i<row;i++) { for(int j=0;j<col;j++) { cout<<ch; } cout<<endl; } return 0; }
-
#include<iostream> using namespace std; int n,cnt=0; int w[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; char map[]={'1','0','X','9','8','7','6','5','4','3','2'}; string s; int main() { cin>>n; while(n--) { cin>>s; int sum=0,flag=1; for(int i=0;i<s.size()-1;i++) { if('0'<=s[i] && s[i]<='9') sum+=(s[i]-'0')*w[i]; else { flag=0; break; } } if(flag && map[sum%11]==s[s.size()-1]) continue; else { cout<<s<<endl; cnt++; } } if(!cnt) cout<<"All passed"<<endl; return 0; }
L2:
-
stl set !!!
#include<iostream> #include<set> using namespace std; typedef long long ll; int n,m,k; set<int> a[51]; int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>m; ll x; for(int j=0;j<m;j++) { cin>>x; a[i].insert(x); } } cin>>k; while(k--) { int x,y; cin>>x>>y; int cnt_x=a[x].size(),cnt_y=a[y].size(),cnt=0; for(set<int>::iterator it=a[x].begin();it!=a[x].end();it++) { if(a[y].find(*it)!=a[y].end()) cnt++; } printf("%.2lf%%\n",(cnt*1.0)/(cnt_x+cnt_y-cnt)*100); } return 0; }
-
已知中序后序构造二叉树,然后层序遍历输出
#include<iostream> #include<vector> #include<queue> using namespace std; int postorder[31],inorder[31],n; struct node{ int left,right; }tree[31]; int build(int la,int ra,int lb,int rb) { if(la>ra) return 0; int root=postorder[rb]; int p1=la; while(inorder[p1]!=root) p1++; int p2=p1-la; tree[root].left=build(la,p1-1,lb,lb+p2-1); tree[root].right=build(p1+1,ra,lb+p2,rb-1); return root; } void bfs(int x) { vector<int> a; queue<int> q; q.push(x); while(!q.empty()) { int ret=q.front(); q.pop(); if(ret==0) break; a.push_back(ret); if(tree[ret].left!=0) q.push(tree[ret].left); if(tree[ret].right!=0) q.push(tree[ret].right); } int len=a.size(); for(int i=0;i<len-1;i++) cout<<a[i]<<" "; cout<<a[len-1]<<endl; } int main() { cin>>n; for(int i=1;i<=n;i++) cin>>postorder[i]; for(int i=1;i<=n;i++) cin>>inorder[i]; build(1,n,1,n); int root=postorder[n]; bfs(root); return 0; }
-
经典的并查集问题,这道题特别烦人,我没写出来,这个代码是 Copy 的
如果不清楚并查集的话,可以参考 👉并查集#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <string> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; typedef unsigned long long ull; const int inf=0x3f3f3f3f; const int maxn=1e4+10; int n,p1,p2,k,d; int fa[maxn],vis[maxn]; struct node{ int id; double ans,sum; }kk[maxn]; struct he{ int id,num,ans,sum; double avgans,avgsum; }final[maxn]; void init(){ for(int i=0;i<10000;i++){ fa[i]=i; final[i].id=0; final[i].num=0; final[i].ans=0; final[i].sum=0; final[i].avgans=0; final[i].avgsum=0; } } int cmp(he a,he b){ if(a.avgsum==b.avgsum) return a.id<b.id; else return a.avgsum>b.avgsum; } int find(int x){ if(fa[x]==x) return x; else return fa[x]=find(fa[x]); } void unite(int x,int y){ x=find(x); y=find(y); if(x==y) return; else fa[y]=x; } int main(){ init(); scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d%d%d",&kk[i].id,&p1,&p2); vis[kk[i].id]=1; if(p1!=-1){ unite(kk[i].id,p1); vis[p1]=1; } if(p2!=-1){ unite(kk[i].id,p2); vis[p2]=1; } scanf("%d",&k); for(int j=1;j<=k;j++){ scanf("%d",&d); unite(kk[i].id,d); vis[d]=1; } scanf("%lf%lf",&kk[i].ans,&kk[i].sum); } for(int i=1;i<=n;i++){ int tmp=find(kk[i].id); final[tmp].ans+=kk[i].ans; final[tmp].sum+=kk[i].sum; } for(int i=0;i<10000;i++){ if(vis[i]){ fa[i]=find(i); if(!final[fa[i]].num) final[fa[i]].id=i; final[fa[i]].num++; final[fa[i]].avgans=final[fa[i]].ans*1.0/final[fa[i]].num; final[fa[i]].avgsum=final[fa[i]].sum*1.0/final[fa[i]].num; } } int ans=0; sort(final,final+10000,cmp); for(int i=0;i<10000;i++){ if(final[i].num) ans++; else break; } printf("%d\n",ans); for(int i=0;i<ans;i++){ printf("%04d %d %.3f %.3f\n",final[i].id,final[i].num,final[i].avgans,final[i].avgsum); } return 0; }
-
啥也别说了,直接暴力
#include<iostream> using namespace std; string s; int ans=1; int main() { getline(cin,s); for(int i=0;i<s.size();i++) { for(int j=s.size()-1;j>=i;j--) { int l=i,r=j; while(l<=r && s[l]==s[r]) { l++; r--; } if(l>r) ans=max(ans,j-i+1); } } cout<<ans; return 0; }
L3:
对不起,我不配,这是给 ACMER 准备的