Poj 2287 田忌赛马解题详解(贪心思想)

来源:互联网 发布:淘宝商品陈列模块代码 编辑:程序博客网 时间:2024/05/29 09:54

题意是:田忌赛马的故事,两个人赛马,第一行输入的数是两个人马的匹数,都是相同的,第二行输入的是田忌的马的强弱值,第三行输入的是国王马的强弱值,然后如果n==0则程序结束。
解题思路:贪心思想
如果田忌的最强马大于国王的最强马直接比
如果田忌的最强马小如国王的最强马拿最弱的那匹马跟国王的最强马比
如果田忌的最强马等于国王的最强马拿最弱的那匹马国王比较
如果·最弱的马跟最弱的马相等直接比较

#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>using namespace std;int n;const int maxn = 100000;int a[maxn];//田忌的马int b[maxn];//齐王的马int cmp(int x1,int x2){    return x1>x2;}int main(){    while(scanf("%d",&n)!=EOF)    {        if(n == 0)        {            return 0;        }        for(int i = 0; i < n; i++)//输入田忌的马        {            scanf("%d",&a[i]);        }        for(int i = 0; i < n; i++)//输入国王的马        {            scanf("%d",&b[i]);        }        sort(a,a+n,cmp);//进行从高到底的一次排序        sort(b,b+n,cmp);        long long  sum =0;        int j = 0;        int i = 0;        int ti = n-1;//最弱的马的位置        int tj = n-1;//国王最弱马的位置        int flag = 0;//比的次数        while(flag!=n)        {            flag++;            if(a[i] > b[j])//如果田忌的最强马的力量大于国王最强马的力量就比            {                i++;                j++;                sum++;            }            else if(a[i] < b[j])//如果田忌的最强马小如国王的最强马的力量就用田忌最弱的马跟国王比输一场            {                ti--;                j++;                sum--;            }            else if(a[i] == b[j])//如果田忌的最强马跟国王最强马相等,            {                if(a[ti] == b[tj])//田忌的最弱马跟国王最弱马相等还是用田忌的最弱马跟国王的最强马相比较                {                    if(a[ti] == b[j])                    {                        ti--;                        j++;                    }                    else if(a[ti] < b[j])//如果田忌的最弱马小如国王的最弱马                    {                        ti--;                        j++;                        sum--;                    }                }                else if(a[ti] < b[tj])//田忌的最弱马小如国王的最弱马还是拿田忌的最弱马跟国王最强马拿来比较                {                    ti--;                    j++;                    sum--;                }                else if(a[ti] > b[tj])//如果田忌的最弱马大于国王的最弱马直接最弱马最弱马相比                {                    ti--;                    tj--;                    sum++;                }            }        }        sum = sum*200;        printf("%lld\n",sum);    }    return 0;}/*几组好的测试数据811 9 8 8 8 4 3 211 8 8 8 8 4 3 2答案:800389 85 8190 85 81答案:20032 3 53 4 4答案:0*/
0 0
原创粉丝点击