poj 3778

这就是个超级水题……!!!!写一写来纪念一下自己的错误……

如果某个学生的的成绩是其他俩个或三个学生成绩的和则给予奖励

直接暴力,所以一开始直接用数组标记两个人或三个人的和,但是忽略了这种情况 20(学生A) =  0 +20(学生A)……

错误代码……!!!

#include <iostream>

#include <cstdio>

#include <cstring>

#include <cmath>

#include <algorithm>

#include <cstdlib>



const int MAXN = 10000 + 10;

const double ESP = 10e-8;

const double Pi = atan(1.0) * 4;

const int INF = 0xffffff;

const int MOD = 10000007;



using namespace std;

struct People{

  int s;

  char n[101];

  bool operator < (const People a)const{

      if(strcmp(n,a.n) < 0)

        return 1;

      return 0;

  }

};

People a[MAXN];

bool vis[400];

int main(){

//    freopen("input.txt","r",stdin);

    int t;

    scanf("%d",&t);

    int n;

    while(t--){

        scanf("%d",&n);

        memset(vis,0,sizeof(vis));

        for(int i = 0;i < n;i++){

            getchar();

            scanf("%s %d",a[i].n,&a[i].s);

        }

        sort(a,a+n);

        for(int i = 0;i < n;i++){

            for(int j = i+1;j < n;j++){

                int tt = a[i].s + a[j].s;

                vis[tt] = 1;

                for(int k = j+1;k < n;k++){

                    tt = a[i].s + a[j].s + a[k].s;

                    vis[tt] = 1;

                }

            }

        }

        int cnt = 0;

        for(int i = 0;i < n;i++){

            if(vis[ a[i].s ]){

                cnt++;

            }

        }

        printf("%d\n",cnt);

        for(int i = 0;i < n;i++){

            if(vis[ a[i].s ]){

                printf("%s\n",a[i].n);

            }

        }



    }

    return 0;

}
View Code

正确……

#include <iostream>

#include <cstdio>

#include <cstring>

#include <cmath>

#include <algorithm>

#include <cstdlib>

#include <string>



const int MAXN = 25 + 10;

const double ESP = 10e-8;

const double Pi = atan(1.0) * 4;

const int INF = 0xffffff;

const int MOD = 10000007;



using namespace std;

struct People{

  int s;

  string n;

};

People a[MAXN];

string str[MAXN];

int main(){

    //freopen("input.txt","r",stdin);

    int t;

    scanf("%d",&t);

    int n;

    while(t--){

        scanf("%d",&n);

        for(int i = 0;i < n;i++){

            cin >> a[i].n >> a[i].s;

        }

        int cnt = 0;

        for(int i = 0;i < n;i++){

            for(int j = 0;j < n;j++){

                if(i == j)

                    continue;

                for(int k = 0;k < n;k++){

                    if(k == i || k == j)

                        continue;

                    if(a[i].s == a[j].s + a[k].s){

                        str[cnt++] = a[i].n;

                        k = n;

                        j = n;

                        break;

                    }

                    for(int l = 0;l < n;l++){

                        if(l == k || l == i || l == j){

                            continue;

                        }

                        if(a[i].s == a[j].s+a[k].s+a[l].s){

                            str[cnt++] = a[i].n;

                            k = n;

                            j = n;

                            l = n;

                            break;

                        }

                    }

                }

            }

        }

        cout << cnt << endl;

        sort(str,str+cnt);

        for(int i = 0;i < cnt;i++){

            cout << str[i] << endl;

        }

    }

    return 0;

}
View Code

 

你可能感兴趣的:(poj)