UVa 1612 Guess (贪心+题意)

时间:2022-09-25 21:11:31

题意:有 n 位选手参加编程比赛。比赛有3道题目,每个选手的每道题目都有一个评测之前的预得分(这个分数和选手提交程序的时间相关,提交的越早,预得分越大)。

接下来 是系统评测。如果某道题未通过测试,则改题的实际得分为0分,否则得分等于预得分。得分相同的选手,ID小的排在前面。

问是否能给出所有3n个得分以及最后的实际名次。如果可能,输出最后一名的最高可能得分。每个预得分均为小于1000的非负实数,最多保留两位小数。

析:首先这个题是一个水题,一点也不难,我就卡在题意上了,卡了一下午,吃饭回来又读了几遍题意才明白,就是给定的ID,这个按名次排的,

也就是说 第 i 个数是名次为 i 的ID,这个地方一定要搞清楚,剩下的就好说了,先按名次从小到大排序,然后从 1 到 n 进行比较,如果当前的总分比前一个要小,

或者总分一样而当前的ID的大,那么就这样,不用改变,如果都不成立,那么就找离他们差值最小的组合,然后用总和减去就行,这个地方在选的时候利用暴力,

一共才3个题,所以可以用二进制法进行枚举,然后找出最接近那一个,如果都所有的都不行,那么就是无解,直接结束就好了。

这个题要注意精度问题,这个很重要的,由于题意说了,最多两位小数,那么可以扩大100倍,最后再除以100,就不用考虑精度了。

代码如下:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <set>
#include <cstring>
#include <cmath> using namespace std;
const int maxn = 16384 + 5;
const int INF = 0x3f3f3f3f;
struct node{
int score[3];//分数
int id, ran;
int getsum(){ return score[0] + score[1] + score[2]; }//返回总分,其实也可以定义一个和变量的
bool operator < (const node &p) const{//按照名次排序
return ran < p.ran;
} };
node a[maxn]; bool solve(int n, int val, bool ok){//第一个参数是要改的哪一个下标,第二个是差值,找和它最近的,
//第三个是判断两个ID是不是当前的大于前一个,用来判断是否可以相等
int num[10];//记录所有的分数可能性
vector<int> v[10];//记录下标,也可不用
for(int i = 0; i < 8; ++i){//二进制枚举
num[i] = 0;
for(int j = 0; j < 3; ++j)
if(i & (1<<j)){ num[i] += a[n].score[j]; v[i].push_back(j); }
} int m = INF;
int t = -1;
for(int i = 0; i < 8; ++i) if((ok && num[i] >= val) || (num[i] > val))//判断是不是大于或者大于等于,
if(num[i] < m){ m = num[i]; t = i; }
if(-1 == t) return false;//如果都找不到,也可以在开始时特,那样会节约时间
for(int i = 0; i < v[t].size(); ++i)//把删除的清0
a[n].score[v[t][i]] = 0;
return true;
} int main(){
// freopen("in.txt", "r", stdin);
int n, kase = 0;
while(scanf("%d", &n) == 1 && n){
for(int i = 0; i < n; ++i)
for(int j = 0; j < 3; ++j){
double x; scanf("%lf", &x);
a[i].score[j] = (int)round(x * 100.0);//主要是把实数变成整数,用的是round函数,四舍五入
}
int x;
for(int i = 0; i < n; ++i){ scanf("%d", &x); a[x-1].ran = i; a[x-1].id = x; }//一定要注意,输入到底是什么
sort(a, a+n); bool ok = true;
for(int i = 1; i < n; ++i){
int s = a[i].getsum(), t = a[i-1].getsum();
if(s < t || (s == t && a[i].id > a[i-1].id)) continue;//当前的小于前一个或者相等但ID当前的大 if(!solve(i, s - t, a[i].id > a[i-1].id)){ ok = false; break; }//如果找不到,直接结束
} printf("Case %d: ", ++kase);
ok ? printf("%.2lf\n", (double)a[n-1].getsum()/100.0) : printf("No solution\n");//最后再除100,变回去
}
return 0;
}

UVa 1612 Guess (贪心+题意)的更多相关文章

  1. 紫书 习题8-8 UVa 1612 (贪心&plus;精度)

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

  2. UVA - 1612 Guess &lpar;猜名次&rpar;&lpar;贪心&rpar;

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

  3. UVa 1617 Laptop &lpar;贪心&rpar;

    题意:有n个长度为1的线段,确定它们的起点,使得第i个线段在[ri,di]之间,输出空隙数目的最小值. 析:很明显的贪心题,贪心策略是这样的,先把所有的区间排序,原则是按右端点进行排序,如果相等再按左 ...

  4. UVA 311 Packets 贪心&plus;模拟

    题意:有6种箱子,1x1 2x2 3x3 4x4 5x5 6x6,已知每种箱子的数量,要用6x6的箱子把全部箱子都装进去,问需要几个. 一开始以为能箱子套箱子,原来不是... 装箱规则:可以把箱子都看 ...

  5. URAL 2021 Scarily interesting&excl; &lpar;贪心&plus;题意&rpar;

    题意:给定两个队伍的每个人的得分,让你安排怎么比赛才能使得观众知道冠军的时间最长. 析:贪心,很简单,就是先开始总分高的先出最差劲的,总分低的先出最厉害的,这个题当时实在是读的不明白啊,WA了好多次. ...

  6. 紫书 习题8-4 UVa 11491 (贪心)

    题意:给你一个数, 要求删去一些数字, 使得剩下的数字最大. 这道题用贪心解决. 大家想一想, 两个数比较大小, 肯定先比较第一位的数,然后依次比较第二位,以此类推. 既然我们要保证最后的数字最大, ...

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

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

  8. UVa 11039 &lpar;排序&plus;贪心&rpar; Building designing

    白书上的例题比较难,认真理解样例代码有助于提高自己 后面的练习题相对简单,独立思考解决问题,增强信心 题意:n个绝对值各不相同的非0整数,选出尽量多的数排成序列,使得该序列正负交错且绝对值递增. 解法 ...

  9. uva 1346 - Songs&lpar;贪心)

    题目链接:uva 1346 - Songs 题目大意:John Doe 是一个著名的DJ,现在他有n首播放个曲, 每首歌曲有识别符key,歌曲长度l,以及播放频率q.想在John Doe 想将磁带上的 ...

随机推荐

  1. linux查看及改变运行级别

    Linux运行级别从0-6,共7个. 0:关机.不能将系统缺省运行级别设置为0,否则无法启动. 1:单用户模式,只允许root用户对系统进行维护. 2:多用户模式,但不能使用NFS(相当于Window ...

  2. java 14-2 正则表达式的案例

    1.判断功能 String类的public boolean matches(String regex) 需求: 判断手机号码是否满足要求? 分析: A:键盘录入手机号码 B:定义手机号码的规则 136 ...

  3. IIS6&period;0服务器搭建网站无法访问解决方法

    IIS6.0服务器搭建网站无法访问解决方法     IIS6.0服务器搭建网站无法访问解决方法很多朋友在用IIS6架网站的时候遇到不少问题,而这些问题有些在过去的IIS5里面就遇到过,有些是新出来的, ...

  4. Twitter实时搜索系统EarlyBird

    twitter要存档tweet采用lucene做全量指数,新发型是实时索引推文.检索实时(10在几秒钟内指数).实时索引和检索系统,称为EarlyBird. 感觉写更清晰,简洁,这个信息是真实的,只有 ...

  5. hosts文件不显示

    1.按住windows键(就是小旗子小窗口键)+R,打开运行:2.在输入框中输入 cmd并回车:3.紧接着在dos窗口中输入"CD \WINDOWS\SYSTEM32\DRIVERS\ETC ...

  6. Filezilla Server 出现Error&comma; could not connect to server解决办法

    打开任务管理器:Win+R:services.msc找到Filezilla Server并启动服务

  7. 一个优化极点的ViewHolder

    代码中有注释: 使用方法: 1.可以在listview,gridview,stageView直接继承LazyAdapter使用 2.下面有Demo 代码 ViewHolder代码: import an ...

  8. windows 8&period;1 cmd命名提示符全屏

    在 C:\Users\wy\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\System Tools 目录下,右键命令提示符-属性中修改:

  9. 终端的rz命令,覆盖原文件。

    不覆盖:rz 覆盖 同名文件:rz -y

  10. POJ2411 铺地砖 Mondriaan&&num;39&semi;s Dream

    Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 15962   Accepted: 923 ...