UVA - 1612 Guess 贪心

题目大意:有n个选手参加比赛,题目共有三道,现在给出n个选手每道题的得分和最后的排名,(每道题的得分依据最后检查是否通过来给分,如果没通过得0分,通过得到相应分),问最后一名选手能得到的最高分是多少。(得分相同,ID小的排前面)

解体思路:要最高分,那第一名肯定要三道题都对。维护一个最高分和上一个人的ID号

接着判断一下下一名的得分,如果有得分相同的情况下,就判断一下ID号

如果当前这个人的ID号比较大,就只需要更新ID就可以了

如果没有得分相同的或者得分相同ID号比上一个人小,就找得分最大的且小于上一个人的得分的值即可

如果上面两个条件都不满足,就是无解了

注意:小数的相等比较,可以先转化成int,最后输出时除以100.0即可

#include<cstdio>
#include<algorithm>
#include<cmath>
#define maxn 20000

using namespace std;

struct player{
    int score[8];
}P[maxn];

int n, ID[maxn];
int main() {
    int cas = 1;
    while(scanf("%d", &n) == 1 && n) {
        double tmp_f[3];
        int tmp_i[3];
        for(int i = 1; i <= n; i++) {
            scanf("%lf%lf%lf", &tmp_f[0], &tmp_f[1], &tmp_f[2]);
            for(int j = 0; j < 3; j++)
                tmp_i[j] = (int)(round(tmp_f[j] * 100.0));

            for(int j = 0; j < 8; j++) {
                P[i].score[j] = 0;
                for(int k = 0; k < 3; k++)
                    if(j & (1 << k))
                        P[i].score[j] += tmp_i[k];
            }
            sort(P[i].score, P[i].score + 8);
        }
        for(int i = 1; i <= n; i++)
            scanf("%d", &ID[i]);

        int MAX = P[ID[1]].score[7];
        int pre_ID = ID[1], i;
        for(i = 2; i <= n; i++) {
            int cur_ID = ID[i];
            bool flag = false;
            for(int j = 7; j >= 0; j--) {
                if(P[cur_ID].score[j]  == MAX  && cur_ID > pre_ID) {
                    flag = true;
                    pre_ID = cur_ID;
                    break;
                }
                if(P[cur_ID].score[j] < MAX) {
                    flag = true;
                    pre_ID = cur_ID;
                    MAX = P[cur_ID].score[j];
                    break;
                }
            }
           if(!flag)
               break;
        }
        printf("Case %d: ", cas++);
        if(i != n + 1)
            printf("No solution\n");
        else
            printf("%.2lf\n", MAX / 100.0);
    }
    return 0;
}
时间: 2024-08-04 10:29:18

UVA - 1612 Guess 贪心的相关文章

uva 1511 - Soju(贪心)

题目链接:uva 1511 - Soju 题目大意:给出两个点集,问说分别从两个点集中取一点的哈夫曼距离最小值.注意一个点集的x坐标小于0,另一个大于0. 解题思路:因为x2一定大于x1,所以对于x这一维,一定是+x2-x1,所以只需要考虑y这一维坐标即可. #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> u

UVa 1612 Guess (贪心+题意)

题意:有 n 位选手参加编程比赛.比赛有3道题目,每个选手的每道题目都有一个评测之前的预得分(这个分数和选手提交程序的时间相关,提交的越早,预得分越大). 接下来 是系统评测.如果某道题未通过测试,则改题的实际得分为0分,否则得分等于预得分.得分相同的选手,ID小的排在前面. 问是否能给出所有3n个得分以及最后的实际名次.如果可能,输出最后一名的最高可能得分.每个预得分均为小于1000的非负实数,最多保留两位小数. 析:首先这个题是一个水题,一点也不难,我就卡在题意上了,卡了一下午,吃饭回来又读

UVA - 1612 Guess (猜名次)(贪心)

题意:有n(n<=16384)位选手参加编程比赛.比赛有3道题目,每个选手的每道题目都有一个评测之前的预得分(这个分数和选手提交程序的时间相关,提交得越早,预得分越大).接下来是系统测试.如果某道题目未通过测试,则该题的实际得分为0分,否则得分等于预得分.得分相同的选手,ID小的排在前面. 已知所有人的预得分,以及最终的排名,问这个排名是否可能存在,若存在,输出最后一名的最高可能得分:否则,输出No solution.每个预得分均为小于1000的非负实数,最多保留两位小数. 分析: 1.因为要保

UVa 1617 Laptop (贪心)

题意:有n个长度为1的线段,确定它们的起点,使得第i个线段在[ri,di]之间,输出空隙数目的最小值. 析:很明显的贪心题,贪心策略是这样的,先把所有的区间排序,原则是按右端点进行排序,如果相等再按左端点排,然后再扫一遍,如果第一个区间的右端点和第二个右端点一样, 一定可以相邻,如果不相等,再看是不是与左端点大小关系,如果小于左端点,那么就一定会产生空隙,如果不是小于,就可以,那么端点要向右移动一个单位,其他的也样判断. 代码如下: #include <cstdio> #include <

Uva - 1612 - Guess

A competition was just over. It had 3 problems and n players. Each player had an ID number from 1 to n. The final rank was decided by the total score of the 3 problems. The higher the total score was, the higher a player ranked (the smaller the rank

UVA - 10037 Bridge 贪心

题目大意:有n个人要过桥,每次只能过去两个,且这两个人中至少有一个人要带手电筒,但手电筒只有一个. 每个人都有一个过桥时间,两个人的过桥时间取决于时间长的那个. 问所有人都过桥需要多少时间,怎么过桥 解题思路:贪心,因为所有人都要过桥,且手电筒只有一个,所以要过桥时间短的人把手电筒拿回来. 有两种过桥方式使过桥时间达到最短,假设t1,t2(t1 <= t2)是当前过桥时间最短的两个人,tm,tn是过桥时间最长的两个人,且(tm <= tn) 第一种过桥方式:(不考虑最后一次t1和t2一起过桥)

UVa 11039 (排序+贪心) Building designing

白书上的例题比较难,认真理解样例代码有助于提高自己 后面的练习题相对简单,独立思考解决问题,增强信心 题意:n个绝对值各不相同的非0整数,选出尽量多的数排成序列,使得该序列正负交错且绝对值递增. 解法:先按绝对值从小到大排序,然后第一个数先入队,然后依次比较后面的数,如果和队尾的数符号相反则入队,直到所有的数遍历完为止 这里用了异或运算,因为这里面没有0,所谓符号相同的两个数异或值为正,不同符号的数异或值为负 1 //#define LOCAL 2 #include <algorithm> 3

uva 1442:Cave(贪心)

题意:一个洞穴长n,告诉你每个位置的地面高度和顶部高度,让你往里灌水,要求水不能碰到天花板(但可以无限接近).求最多的水量.(洞穴两边视为封闭) 思路:如果知道一个位置向左看最高可以多高,向右看最高可以多高,就可以知道这个位置最终的高度了.方法是扫两次.每次扫的时候,定义一个之前最高值.若之前最高值高于现在的顶,则下降至顶.若低于底,则上升至底(因为后面的这种高度能被这个底挡住).如果在中间则不用变. 代码: #include <cstdio> #include <cstring>

Guess UVA - 1612

这题题目很简单,但是卡了一下精度,因为题目说精确小数点两位 首先要把出入×100然后要用round函数四舍五入,才能去除精度问题 #include<stdio.h> #include<iostream> #include<map> #include<queue> #include<math.h> #include<algorithm> using namespace std; #define MST(vis,x) memset(vis