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("
");
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题就是找规律、- - 以后不能这么傻了

    

原文地址:https://www.cnblogs.com/sasuke-/p/5177401.html