这就是个超级水题……!!!!写一写来纪念一下自己的错误……
如果某个学生的的成绩是其他俩个或三个学生成绩的和则给予奖励
直接暴力,所以一开始直接用数组标记两个人或三个人的和,但是忽略了这种情况 20(学生A) = 0 + 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; }
正确……
#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; }
时间: 2024-10-19 21:17:32