这就是个超级水题……!!!!写一写来纪念一下自己的错误……
如果某个学生的的成绩是其他俩个或三个学生成绩的和则给予奖励
直接暴力,所以一开始直接用数组标记两个人或三个人的和,但是忽略了这种情况 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; }