题意:有n(n<=16384)位选手参加编程比赛。比赛有3道题目,每个选手的每道题目都有一个评测之前的预得分(这个分数和选手提交程序的时间相关,提交得越早,预得分越大)。接下来是系统测试。如果某道题目未通过测试,则该题的实际得分为0分,否则得分等于预得分。得分相同的选手,ID小的排在前面。

已知所有人的预得分,以及最终的排名,问这个排名是否可能存在,若存在,输出最后一名的最高可能得分;否则,输出No solution。每个预得分均为小于1000的非负实数,最多保留两位小数。

分析:

1、因为要保证最后一名的最高可能总分最高,所以排名在前面的人每次递减的分要尽可能少,排名第一的人分数自然不用减少。

2、如果分数与前一个名次的人相同,但是ID比前一个名次的人大,那就没必要减少总分。

3、如果分数本来就比前一个名次的人低,也没必要减少总分。

4、如果不满足条件2和3,那么就需要减少分数,假设一个人三个题目预得分为a,b,c,那么可能减少的分数是a,b,c,a+b,a+c,b+c,a+b+c,排序后,尽可能少的减少分数。

注意如果ID比前一个名次的人大,那么减少到与前一个名次的人总分相同时即可;否则,要减少到比前一个名次的人的总分小。

#pragma comment(linker, "/STACK:102400000, 102400000")
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<deque>
#include<queue>
#include<list>
#define Min(a, b) ((a < b) ? a : b)
#define Max(a, b) ((a < b) ? b : a)
typedef long long LL;
typedef unsigned long long ULL;
const int INT_INF = 0x3f3f3f3f;
const int INT_M_INF = 0x7f7f7f7f;
const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
const LL LL_M_INF = 0x7f7f7f7f7f7f7f7f;
const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};
const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};
const int MOD = 1e9 + 7;
const double pi = acos(-1.0);
const double eps = 1e-8;
const int MAXN = 16384 + 10;
const int MAXT = 10000 + 10;
inline int dcmp(double a, double b) {
if(fabs(a - b) < eps) return 0;
return a < b ? -1 : 1;
}
using namespace std;
struct Node{
double a, b, c, tot;
double sum[10];
void read(){
scanf("%lf%lf%lf", &a, &b, &c);
tot = a + b + c;
sum[0] = a;
sum[1] = b;
sum[2] = c;
sum[3] = a + b;
sum[4] = b + c;
sum[5] = a + c;
sum[6] = a + b + c;
sort(sum, sum + 7);
}
}num[MAXN];
int a[MAXN];
int main(){
int n;
int kase = 0;
while(scanf("%d", &n) == 1){
if(!n) return 0;
for(int i = 0; i < n; ++i){
num[i].read();
}
for(int i = 0; i < n; ++i){
scanf("%d", &a[i]);
}
printf("Case %d: ", ++kase);
if(n <= 0){
printf("No solution\n");
continue;
}
bool flag = true;
for(int i = 0; i < n; ++i){
if(!i) continue;
else if(dcmp(num[a[i] - 1].tot, num[a[i - 1] - 1].tot) == 0){
if(a[i] > a[i - 1]) continue;
}
else if(dcmp(num[a[i] - 1].tot, num[a[i - 1] - 1].tot) == -1) continue;
bool ok = false;
for(int j = 0; j < 7; ++j){
if(dcmp(num[a[i] - 1].tot - num[a[i] - 1].sum[j], num[a[i - 1] - 1].tot) == -1 || (dcmp(num[a[i] - 1].tot - num[a[i] - 1].sum[j], num[a[i - 1] - 1].tot) == 0 && a[i] > a[i - 1])){
num[a[i] - 1].tot -= num[a[i] - 1].sum[j];
ok = true;
break;
}
}
if(!ok){
flag = false;
break;
}
}
if(!flag){
printf("No solution\n");
}
else{
printf("%.2lf\n", num[a[n - 1] - 1].tot);
}
}
return 0;
}

  

UVA - 1612 Guess (猜名次)(贪心)的更多相关文章

  1. UVa 1612 Guess (贪心+题意)

    题意:有 n 位选手参加编程比赛.比赛有3道题目,每个选手的每道题目都有一个评测之前的预得分(这个分数和选手提交程序的时间相关,提交的越早,预得分越大). 接下来 是系统评测.如果某道题未通过测试,则 ...

  2. 紫书 习题8-8 UVa 1612 (贪心+精度)

    这道题我很快就写出来了, 但是一直WA, 然后发现是精度, 这坑了我一个小时-- (1)贪心.每次就尽量分数高, 可以保证最后分数最高 (2)神tm精度问题.记住判断大于小于和等于的时候要用EPS(1 ...

  3. 【uva 1612】Guess(算法效率,2种想法)

    题意:已知 N 位选手的3题的预期得分,得分要不全拿,要不为0.且知道最后的实际名次,而且得分相同的选手,ID小的排在前面.问这样的名次可能吗.若可能,输出最后一名的最高可能得分.(N≤16384) ...

  4. 【NOIP合并果子】uva 10954 add all【贪心】——yhx

    Yup!! The problem name reects your task; just add a set of numbers. But you may feel yourselvesconde ...

  5. uva 11134 fabled rooks (贪心)——yhx

    We would like to place n rooks, 1 n 5000, on a n nboard subject to the following restrictions• The i ...

  6. UVa 11134 (区间上的贪心) Fabled Rooks

    这道题真是WA得我心力交瘁,好讨厌的感觉啊! 简直木有写题解的心情了 题意: n×n的棋盘里,放置n个车,使得任意两车不同行且不同列,且第i个车必须放在给定的第i个矩形范围内.输出一种方案,即每个车的 ...

  7. UVA 12382 Grid of Lamps 贪心

    题目链接: C - Grid of Lamps Time Limit:1000MSMemory Limit: 0KB 问题描述 We have a grid of lamps. Some of the ...

  8. uva 993 Product of digits (贪心 + 分解因子)

      Product of digits  For a given non-negative integer number N , find the minimal natural Q such tha ...

  9. UVA 11729 - Commando War(贪心 相邻交换法)

    Commando War There is a war and it doesn't look very promising for your country. Now it's time to ac ...

随机推荐

  1. Django:验证码相关问题

    http://blog.csdn.net/csapr1987/article/details/7728315 https://zhidao.baidu.com/question/13837387222 ...

  2. mutiset的简单介绍转载

    原文链接:https://blog.csdn.net/sodacoco/article/details/84798621        c++语言中,multiset是<set>库中一个非 ...

  3. Day2-L-棋盘问题-POJ1321

    在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. ...

  4. IOS 3种内省方法

    IOS提供了3种内省方法 isKindOfClass 检查当前实例是否为某类及其子类 UIView *b = [UIView new]; //... id a = b; if ([a isMember ...

  5. html5和html4.0.1的<html>标记的区别

    html5新增了一个 manifest属性,定义了缓存信息. html5中废弃了xmlns属性,这个属性在html转换成xhtml是非常有用的,但是html5中并不需要,因此不用写. 但是如果非要写那 ...

  6. VS 右键属性闪一下啥也打不开问题

    unity项目,从vs项目右键属性闪一下啥也打不开的问题这个是因为工程是unity管理的,里面有个插件默认设定不可查看修改属性修改:vs中打开“工程”->"选项"中(修改后这 ...

  7. webpack 命令 Module build failed (from ./node_modules/babel-loader/lib/index.js) 错误问题解决方案

    在项目中运行的时候出现报错,错误为Module build failed (from ./node_modules/babel-loader/lib/index.js) 解决方案: 控制台输入  np ...

  8. vue使用videojs控制后台m3u8数据请求

    关于Video.js的使用方法就不再说了,有兴趣的请迁跃:https://videojs.com/ VideoJS中并没有stop之类控制后台数据请求的参数,只有暂停 video.pause()方法 ...

  9. vue - 子组件向父组件 传递方法和参数

    1,子组件 TodoItem.vue  : <template>   <div class="todo-item" :class="{'is-compl ...

  10. 04.swoole学习笔记--webSocket服务器

    <?php //创建webSocket服务器 $serv=); //获取请求 //on //open 建立连接 $serv:服务器 $request:客户端信息 $serv->on('op ...