poj 3778

时间:2021-11-09 08:02:50

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

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

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

错误代码……!!!

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdlib> const int MAXN = + ;
const double ESP = 10e-;
const double Pi = atan(1.0) * ;
const int INF = 0xffffff;
const int MOD = ; using namespace std;
struct People{
int s;
char n[];
bool operator < (const People a)const{
if(strcmp(n,a.n) < )
return ;
return ;
}
};
People a[MAXN];
bool vis[];
int main(){
// freopen("input.txt","r",stdin);
int t;
scanf("%d",&t);
int n;
while(t--){
scanf("%d",&n);
memset(vis,,sizeof(vis));
for(int i = ;i < n;i++){
getchar();
scanf("%s %d",a[i].n,&a[i].s);
}
sort(a,a+n);
for(int i = ;i < n;i++){
for(int j = i+;j < n;j++){
int tt = a[i].s + a[j].s;
vis[tt] = ;
for(int k = j+;k < n;k++){
tt = a[i].s + a[j].s + a[k].s;
vis[tt] = ;
}
}
}
int cnt = ;
for(int i = ;i < n;i++){
if(vis[ a[i].s ]){
cnt++;
}
}
printf("%d\n",cnt);
for(int i = ;i < n;i++){
if(vis[ a[i].s ]){
printf("%s\n",a[i].n);
}
} }
return ;
}

正确……

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <string> const int MAXN = + ;
const double ESP = 10e-;
const double Pi = atan(1.0) * ;
const int INF = 0xffffff;
const int MOD = ; 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 = ;i < n;i++){
cin >> a[i].n >> a[i].s;
}
int cnt = ;
for(int i = ;i < n;i++){
for(int j = ;j < n;j++){
if(i == j)
continue;
for(int k = ;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 = ;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 = ;i < cnt;i++){
cout << str[i] << endl;
}
}
return ;
}