POJ 2497 Strategies 简单模拟

    又是一道模拟题,我感觉模拟题的特点就是看起来很简单,做起来又比较麻烦,主要是细节部分,不找张纸画画就能做出来的绝对是大神,至少我不是。。。这道模拟题做了一上午,一直WA,究其原因,只因为我使用了一个超长的if(),不要问我多长,至少可以亮瞎24K氪金狗眼尴尬

      回到正题,还是让我们回过头来看看这道题,英文题目不粘了,粘了估计也没人看,题目大意:有三个人参加ACM比赛,他们三个人有不同的做题策略,

          Bill:按照题目的顺序一道一道做;

          Steve:按照先以后难的顺序做;

          Linus:按照先难后易的顺序做;

然后题目会给出每一场测试的时间和题目的个数,以及每道题目每个人要花多长时间才能做出来,

      得分计算标准:从比赛开始到某道题目被做出来的时间段为这道题目的得分

      赢的标准:首先看谁做出的题目多,一样多看得分少的,得分也一样就让Steve赢

最后输出赢得人做出的题目数以及得分。


看似好像很简单,其实就是很简单,但有几个地方需要注意:

    1.在计算所能做出的题目总数的时候,你要判断的条件是每道题目所花的时间之和,即总时间

    2.在计算得分的时候,你要累加的是每道题目从比赛开始到做出来所用的时间,比如第一道题目做出来要用时间T1,第二道题目做出来要用时间T2,那么做出第二道题的得分为T1+T2

    3.不管你用什么方式做(我是用的结构体),要注意变量的初始化

    4.针对本道题目,在最后进行结构体排序的时候,有一个小技巧,因为题目说如果做出的题目数和得分都一样就让Steve赢,那么也可以理解为名字作为第三个判断条件,正好Steve这个名字在字典序中是最大的,所以可以进行判断。

最后,上代码,写的不是很好,要是哪里可以优化欢迎评论

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

struct People
{
    string name;
    int solvepro;
    int score;
}peo[3];

int cmp(int i,int j)
{
    if(i>j)
        return 1;
    return 0;
}

int cmp1(People p1,People p2)
{
    if(p1.solvepro>p2.solvepro)
        return 1;
    else if(p1.solvepro==p2.solvepro)
    {
        if(p1.score<p2.score)
            return 1;
        else if(p1.score==p2.score)
            if(p1.name>p2.name)
            return 1;
    }
    return 0;
}



int main()
{
    int T,i,j;
    cin>>T;
    for(i=1;i<=T;i++)
    {
        peo[0].name="Bill";
        peo[1].name="Steve";
        peo[2].name="Linus";
        int time,pronum,score=0,sum,time0=0;
        cin>>time>>pronum;
        int *dif=new int[pronum];
        int *dif0=new int[pronum];

        for(j=0;j<pronum;j++)
        {
            cin>>dif[j];
        }





        for(j=0;j<pronum;j++)
        {
            dif0[j]=dif[j];
        }
        sum=0;
        for(j=0;j<pronum;j++)
        {
            dif0[j]=sum+dif0[j];
            sum=dif0[j];
        }

        time0=0;
        score=0;
        for(j=0;j<pronum;j++)
        {
            if((time0+dif[j])>time)
                break;
            else
            {
                score=score+dif0[j];
                time0=time0+dif[j];
            }

        }

        peo[0].solvepro=j;
        peo[0].score=score;





        sort(dif,dif+pronum);
        for(j=0;j<pronum;j++)
        {
            dif0[j]=dif[j];
        }
        sum=0;
        for(j=0;j<pronum;j++)
        {
            dif0[j]=sum+dif0[j];
            sum=dif0[j];
        }
        time0=0;
        score=0;
        for(j=0;j<pronum;j++)
        {
            if((time0+dif[j])>time)
                break;
            else
            {
                score=score+dif0[j];
                time0=time0+dif[j];
            }
        }

        peo[1].solvepro=j;
        peo[1].score=score;






        sort(dif,dif+pronum,cmp);
        for(j=0;j<pronum;j++)
        {
            dif0[j]=dif[j];
        }
        sum=0;
        for(j=0;j<pronum;j++)
        {
            dif0[j]=sum+dif0[j];
            sum=dif0[j];
        }
        time0=0;
        score=0;
        for(j=0;j<pronum;j++)
        {
            if((score+dif[j])>time)
                break;
            else
            {
                score=score+dif0[j];
                time0=time0+dif[j];
            }
        }
        peo[2].solvepro=j;
        peo[2].score=score;



        sort(peo,peo+3,cmp1);

        cout<<"Scenario #"<<i<<":"<<endl;
            cout<<peo[0].name<<" wins with "<<peo[0].solvepro<<" solved problems and a score of "<<peo[0].score<<"."<<endl;
            cout<<endl;

    }
    return 0;
}


你可能感兴趣的:(poj,strategies,简单模拟,2497)