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
",cnt);
        for(int i = 0;i < n;i++){
            if(vis[ a[i].s ]){
                printf("%s
",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
原文地址:https://www.cnblogs.com/hanbinggan/p/4394485.html