zoukankan      html  css  js  c++  java
  • POJ 2497 Strategies

    题意:有三个人,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:
    ",testcase);
            printf("%s wins with %d solved problems and a score of %d.
    ",p[0].name,p[0].p,p[0].s);
            if(testcase<n) printf("
    ");
        }
        return 0;
    }
    
    




  • 相关阅读:
    jQuery选择器大全
    MVC自定义数据验证(两个时间的比较)
    SQLServer开发总结
    疯狂的订餐系统软件需求分析挑战之旅1
    疯狂的订餐系统软件需求分析挑战之旅2
    net中C#自动化调用Word的实例总结
    软件开发中代码自动化的一点浅见
    代码自动化(1)开篇
    代码自动化(2)程序设计
    Excel 手机号码、身份证 等信息 导入到SQL2005 中,转换成字符是自动变成 科学计数法 的解决方法
  • 原文地址:https://www.cnblogs.com/gongpixin/p/4477367.html
Copyright © 2011-2022 走看看