Wunder Fund Round 2016 (Div. 1 + Div. 2 combined)
现在水平真的不够、只能够做做水题
A. Slime Combining
题意:就是给n个1给你、两个相同的数可以合并成一个数,比如说有两个相同的v,合并后的值就是v+1
思路:直接模拟栈
1 #include<iostream> 2 #include<algorithm> 3 #include<stack> 4 using namespace std; 5 int num[10000]; 6 int main() 7 { 8 int n; 9 while(cin >> n){ 10 stack<int>p; 11 p.push(1); 12 for(int i=1;i<n;++i){ 13 p.push(1); 14 int x,y; 15 while(p.size()>=2){ 16 x=p.top();p.pop(); 17 y=p.top();p.pop(); 18 if(x==y) 19 p.push(x+1); 20 else{ 21 p.push(y);p.push(x); 22 break; 23 } 24 } 25 } 26 int k=0; 27 while(!p.empty()){ 28 num[k++]=p.top(); 29 p.pop(); 30 } 31 for(int i=k-1;i>=0;--i) 32 if(i==k-1) cout << num[i]; 33 else cout << " " << num[i]; 34 cout << endl; 35 } 36 }
B. Guess the Permutation
这题还想了好久、其实想通了就很简单了
题意:给你一个正方形的数值阵,每一个数值阵中的值map[i][j]=min(a[i],a[j]),也就是值是两者中较小的一个,数组a是一个序列,让你通过这个数值阵去还原数组a
思路:每一行中如果不同的元素个数等于n个,那么这个序列除了0以为其他的数值就是数组a中的序列数,剩下的只要把0改成n就可以了
还一种思路(被人家教育了)就是每一行中的最大值其实就是数组a[i]的值、但需要注意n-1的n,(思考)
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<set> 6 using namespace std; 7 const int qq=55; 8 int map[qq][qq]; 9 int main() 10 { 11 set<int>p[qq]; 12 int n;scanf("%d",&n); 13 for(int j,i=1;i<=n;++i){ 14 for(j=1;j<=n;++j){ 15 scanf("%d",&map[i][j]); 16 p[i].insert(map[i][j]); 17 } 18 } 19 int ans; 20 for(int i=1;i<=n;++i) 21 if(p[i].size()==n){ 22 ans=i;break; 23 } 24 for(int i=1;i<=n;++i){ 25 if(i==1) 26 if(map[ans][i]!=0) printf("%d",map[ans][i]); 27 else printf("%d",n); 28 else 29 if(map[ans][i]!=0) printf(" %d",map[ans][i]); 30 else printf(" %d",n); 31 } 32 printf("\n"); 33 } 34
#include<iostream> using namespace std; int main() { int n,f=1; cin>>n; for(int i=0;i<n;i++){ int m=0; for(int j=0;j<n;j++) { int x; cin>>x; m=max(m,x); } if(m==n-1 && f) { f=0; m+=1; } cout<<m<<" "; } return 0; }
说白了B题就是找规律、- - 以后不能这么傻了