poj 3778

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

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

直接暴力,所以一开始直接用数组标记两个人或三个人的和,但是忽略了这种情况 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

poj 3778的相关文章

POJ - 3186 Treats for the Cows (区间DP)

题目链接:http://poj.org/problem?id=3186 题意:给定一组序列,取n次,每次可以取序列最前面的数或最后面的数,第n次出来就乘n,然后求和的最大值. 题解:用dp[i][j]表示i~j区间和的最大值,然后根据这个状态可以从删前和删后转移过来,推出状态转移方程: dp[i][j]=max(dp[i+1][j]+value[i]*k,dp[i][j-1]+value[j]*k) 1 #include <iostream> 2 #include <algorithm&

POJ 2533 - Longest Ordered Subsequence(最长上升子序列) 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:http://poj.org/problem?id=2533 Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence (a1, a2, ..., aN) be any sequence (ai1, ai2, ..., aiK)

POJ——T2271 Guardian of Decency

http://poj.org/problem?id=2771 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 5932   Accepted: 2463 Description Frank N. Stein is a very conservative high-school teacher. He wants to take some of his students on an excursion, but he is

POJ——T2446 Chessboard

http://poj.org/problem?id=2446 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18560   Accepted: 5857 Description Alice and Bob often play games on chessboard. One day, Alice draws a board with size M * N. She wants Bob to use a lot of c

poj 1088 滑雪 DP(dfs的记忆化搜索)

题目地址:http://poj.org/problem?id=1088 题目大意:给你一个m*n的矩阵 如果其中一个点高于另一个点 那么就可以从高点向下滑 直到没有可以下滑的时候 就得到一条下滑路径 求最大的下滑路径 分析:因为只能从高峰滑到低峰,无后效性,所以每个点都可以找到自己的最长下滑距离(只与自己高度有关).记忆每个点的最长下滑距离,当有另一个点的下滑路径遇到这个点的时候,直接加上这个点的最长下滑距离. dp递推式是,dp[x][y] = max(dp[x][y],dp[x+1][y]+

POJ 1385 计算几何 多边形重心

链接: http://poj.org/problem?id=1385 题意: 给你一个多边形,求它的重心 题解: 模板题,但是不知道为啥我的结果输出的确是-0.00 -0.00 所以我又写了个 if (ans.x == 0) ans.x = 0 感觉好傻逼 代码: 1 #include <map> 2 #include <set> 3 #include <cmath> 4 #include <queue> 5 #include <stack> 6

POJ 1741 Tree(树的点分治,入门题)

Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 21357   Accepted: 7006 Description Give a tree with n vertices,each edge has a length(positive integer less than 1001).Define dist(u,v)=The min distance between node u and v.Give an in

poj 1655 树的重心

Balancing Act Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13178   Accepted: 5565 Description Consider a tree T with N (1 <= N <= 20,000) nodes numbered 1...N. Deleting any node from the tree yields a forest: a collection of one or m

POJ 2479 Maximum sum

http://poj.org/problem?id=2479 题意: 给出一个整数串,求连续子串1和连续子串2,不相交并且串1加串2的和最大. 思路: 其实就是求最大连续和,题意要求就是求两段最大连续和.我们可以从左边和右边分别求最大连续和,代码中的dp_l[i]就是1~i的最大连续和,dp_r[i]则是i~n的最大连续和. 1 #include<iostream> 2 #include<string> 3 #include<cstring> 4 #include<