题意:有三个人,Bill, Steve and Linus,他们参加竞赛,给出竞赛的题目和比赛时间,然后给出每道题需要的时间(他们解同一道题花的时间相同),然后他们有不同的策略来做题。每道题的得分为当前比赛进行的时间,最后的得分为所有题目得分的和。最后做出题目最多的人获胜(若做出题目数目相同,则看得分最少)。如果三人都相同,那么规定Steve为胜者。(我在想一个问题,会不会出现这种情况,那就是Bill和Linus做的题目相同,且他俩排名高于Steve,那么胜者应该是Bill还是Linus???------貌似应该不会出现这种情形)

3人得策略如下,

Bill:  按题目给的顺序依次往下做

Steve: 先做花费时间小的题目

Linus:先做花费时间大的题目

思路:直接的想法就是,直接把三个人结果的求出来,比较一下,得出胜者(我也是这么做的)

但是,看了poj讨论版中的评论,有的说这样的策略很明显胜者就是Steve,因为他这是最优的策略。自己想想也是这么回事。。。那么直接求Steve的结果,输出就ok了

代码:分别求的三个人得结果,进行比较

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; struct node{
int p;//解题数目
int s;//得分
int y;//优先级,把Steve的设为最高,在最后排序时使用
char name[10];//姓名
};
bool cmp(node a,node b){
if(a.p!=b.p) return a.p>b.p;//解题数目多的在前
if(a.s!=b.s) return a.s<b.s;//得分少的在前
return a.y<b.y;//当解题数目和得分相同时,把Steve排在最前面
}
int main(){
int n,n2,totaltime,num,a[30],i,timeused,testcase=0;
node p[3];
scanf("%d",&n);//测试组数
n2=n;
while(n2--){
testcase++;
timeused=0;
scanf("%d%d",&totaltime,&num);//比赛时间,题目数量
memset(p,0,sizeof(p));
p[0].y=p[2].y=1;
strcpy(p[0].name,"Bill");
strcpy(p[1].name,"Steve");
strcpy(p[2].name,"Linus");
for(i=0;i<num;i++)//输入每道题所花费的时间
scanf("%d",&a[i]);
for(i=0;i<num;i++){//Bill得分
timeused=timeused+a[i];
if(timeused>totaltime) break;
p[0].p++;
p[0].s=p[0].s+timeused;
}
sort(a,a+num);//把题目按时间升序
timeused=0;
for(i=0;i<num;i++){//Steve得分
timeused=timeused+a[i];
if(timeused>totaltime) break;
p[1].p++;
p[1].s=p[1].s+timeused;
}
timeused=0;
for(i=num-1;i>=0;i--){//Linus得分
timeused=timeused+a[i];
if(timeused>totaltime) break;
p[2].p++;
p[2].s=p[2].s+timeused;
}
sort(p,p+3,cmp);//排序,排完后第一名在p[0]
printf("Scenario #%d:\n",testcase);
printf("%s wins with %d solved problems and a score of %d.\n",p[0].name,p[0].p,p[0].s);
if(testcase<n) printf("\n");
}
return 0;
}

POJ 2497 Strategies的更多相关文章

  1. POJ 3370. Halloween treats 抽屉原理 / 鸽巢原理

    Halloween treats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7644   Accepted: 2798 ...

  2. POJ 2356. Find a multiple 抽屉原理 / 鸽巢原理

    Find a multiple Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7192   Accepted: 3138   ...

  3. POJ 2965. The Pilots Brothers' refrigerator 枚举or爆搜or分治

    The Pilots Brothers' refrigerator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22286 ...

  4. POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37427   Accepted: 16288 Descr ...

  5. POJ 3254. Corn Fields 状态压缩DP (入门级)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9806   Accepted: 5185 Descr ...

  6. POJ 2739. Sum of Consecutive Prime Numbers

    Sum of Consecutive Prime Numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20050 ...

  7. POJ 2255. Tree Recovery

    Tree Recovery Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11939   Accepted: 7493 De ...

  8. POJ 2752 Seek the Name, Seek the Fame [kmp]

    Seek the Name, Seek the Fame Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17898   Ac ...

  9. poj 2352 Stars 数星星 详解

    题目: poj 2352 Stars 数星星 题意:已知n个星星的坐标.每个星星都有一个等级,数值等于坐标系内纵坐标和横坐标皆不大于它的星星的个数.星星的坐标按照纵坐标从小到大的顺序给出,纵坐标相同时 ...

随机推荐

  1. 谈 API 的撰写 - 架构

    在 谈 API 的撰写 - 总览 里我们谈到了做一个 API 系统的基本思路和一些组件的选型,今天谈谈架构. 部署 首先要考虑的架构是部署的架构.部署的方案往往会深刻影响着系统的结构.我们需要问自己一 ...

  2. (六)jQuery选择器

    jQuery 的选择器可谓之强大无比,这里简单地总结一下常用的元素查找方法: $("#myELement") 选择id值等于myElement的元素,id值不能重复在文档中只能有一 ...

  3. js玩转数字----取整,四舍五入,数字字符串转换

    取整: 向下取整Math.floor(),向上取整Math.ceil(),四舍五入Math.round()),保留有效数位n.toFixed(),产生大于等于0小于1的随机数Math.random() ...

  4. 对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符。 给定一个字符串(不一定全为字母)A及它的长度n。请返回第一个重复出现的字符。保证字符串中有重复字符,字符串的长度小于等于500。

    // 第一种方法 // ConsoleApplication10.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include < ...

  5. 如何在linux centos下安装git(转)

    今天想开通github的服务,于是在服务器上安装git,百度到的结果千篇一律的全都有错误,给大家总结分享下. 如果yum install git可以直接安装的可以不通过源码编译安装. 源码安装步骤如下 ...

  6. HDU 2473 Junk-Mail Filter(并查集的删除操作)

    题目地址:pid=2473">HDU 2473 这题曾经碰到过,没做出来. .如今又做了做,还是没做出来. ... 这题涉及到并查集的删除操作.想到了设一个虚节点,可是我把虚节点设为了 ...

  7. CF459C Pashmak and Buses 打印全排列

    这题假设将终于的结果竖着看,每一列构成的数能够看成是k进制的数.一共同拥有d列,随意两列都不同样,所以这就是一个d位k进制数全排列的问题,一共同拥有k ^ d个排列.假设k ^ d < n,则打 ...

  8. 【BZOJ1499】[NOI2005]瑰丽华尔兹 单调队列+DP

    [BZOJ1499][NOI2005]瑰丽华尔兹 Description 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是 ...

  9. HTML5画布(基础篇11-10)

    <script type="text/javascript"> $(function(){ var s = $("#myCanvas")[0]; v ...

  10. git merge的本质

    1 git merge [branch] 将[branch]这个分支merge到当前分支. 2 merge的本质 merge就是把branch上的提交合入当前分支的提交树,这两个分支上的所有提交的历史 ...