POJ2287 Tian Ji -- The Horse Racing【贪心】

题目链接:

http://poj.org/problem?id=2287

题目大意:

田忌和大王赛马,两个人各有N匹马,每匹马都有一个速度,跑的快的胜,慢的就输。田忌每赢一

把得200,平了不得钱,输了输200。每次大王先出马,田忌再出马。问:田忌最多能得多少钱。

思路:

贪心思想。现对田忌和大王的马进行排序。田忌的马速度从小到大排列,大王的马速度从大到小排

列。为了尽可能的赢,田忌就要采取以下策略:

1)尽可能用自己速度低的马去赢得大王速度快的马。

2)剩下赢不了的马,尽可能用自己的马和大王的马打平手

3)剩下的既不能赢得比赛,也不能平手的马就只能是输了

用NumA[]数组和NumB[]数组分别标记已经知道胜负的马,遍历两次田忌和大王的马,第一次找出

能赢大王的马,第二次从剩下的马中找出能与大王的马平手的马。然后计算赢得的金钱。

AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;

int A[1100],B[1100],NumA[1100],NumB[1100];

int cmp(int a,int b)
{
    return a > b;
}

int main()
{
    int N;
    while(~scanf("%d",&N))
    {
        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);
        sort(B,B+N,cmp);
        memset(NumA,0,sizeof(NumA));
        memset(NumB,0,sizeof(NumB));
        //尽可能去赢
        for(int i = 0; i < N; ++i)  //田忌
        {
            for(int j = 0; j < N; ++j)  //国王
            {
                if(A[i] > B[j] && !NumA[i] && !NumB[j])
                {
                    NumA[i] = 1;
                    NumB[j] = 1;
                    break;
                }
            }
        }
        //赢不了就尽可能平手
        for(int i = 0; i < N; ++i)
        {
            for(int j = 0; j < N; ++j)
            {
                if(A[i] == B[j] && !NumA[i] && !NumB[j])
                {
                    NumA[i] = 2;
                    NumB[j] = 2;
                    break;
                }
            }
        }
        int ans = 0;
        for(int i = 0; i < N; ++i)
            if(NumA[i] == 1)
                ans += 200;
            else if(NumA[i] == 2)
                continue;
            else
                ans -= 200;

        printf("%d\n",ans);
    }

    return 0;
}
时间: 2024-10-09 18:53:07

POJ2287 Tian Ji -- The Horse Racing【贪心】的相关文章

HDU1052 Tian Ji -- The Horse Racing 贪心

Tian Ji -- The Horse Racing Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1052 Description Here is a famous story in Chinese history. "That was about 2300 years ago. General Tian Ji was a

HDU 1052 Tian Ji -- The Horse Racing (贪心)

题意:田忌赛马,问你田忌最多能赢多少银子. 析:贪心,绝对贪心的题,贪心策略是: 1.如果田忌当前的最快的马能追上齐王的,那么就直接赢一局 2.如果田忌当前的最慢的马能追上齐王的,那么就直接赢一局 3.如果田忌当前的最慢的马不能超过齐王的,那么就输一局,并把齐王最快的干掉 通过以上策略,就是田忌赢的最多. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #incl

HDU ACM 1052 Tian Ji -- The Horse Racing 贪心

#include<iostream> #include<algorithm> using namespace std; int main() //贪心 { int n,money,i,j,i1,j1; int a[1005],b[1005]; while(cin>>n && n) { for(i=0;i<n;i++) cin>>a[i]; for(i=0;i<n;i++) cin>>b[i]; sort(a,a+n);

HDU-1052 Tian Ji -- The Horse Racing 贪心 考虑特殊位置(首尾元素)的讨论

题目链接:https://cn.vjudge.net/problem/HDU-1052 题意 田忌赛马问题扩展版 给n匹马,马的能力可以相同 问得分最大多少 思路 贪心做得还是太少,一开始一点思虑都没有的 这里稍微总结一下如何打开思路吧 从特殊位置开始考虑是否存在某种必然性,包括不限于序列首尾 若讨论难以进行,试着把这个讨论点展开,换个角度(或者换个特殊位置)讨论 首先排序 其次的关键是讨论尾元素是否必胜或必败,思考贪心 在一个关键是双方尾元素相同时,展开考虑首元素是否必胜或必败,思考贪心 当首

poj 2287 Tian Ji -- The Horse Racing (贪心)

# include <stdio.h> # include <algorithm> # include <string.h> using namespace std; int main() { int n,i,j,k,count; int flag1[1010],flag2[1010],a[1010],b[1010]; while(~scanf("%d",&n),n) { for(i=0;i<n;i++) scanf("%d&

poj2287 Tian Ji -- The Horse Racing

传送门 分析 这个题和传统的田忌赛马不一样的地方就是多了平局情况,所有我们不难想到要用dp.我们先将两人的马均降序排列,用dpij表示考虑前i匹马,田忌有几匹马是按从大到小的顺序从头取的(剩下的是从尾部取的). 代码 #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cctype> #i

hdoj 1052 Tian Ji -- The Horse Racing【田忌赛马】 【贪心】

思路:先按从小到大排序, 然后从最快的開始比(如果i, j 是最慢的一端, flag1, flag2是最快的一端 ),田的最快的大于king的 则比較,如果等于然后推断,有三种情况: 一:大于则比較,二等于在推断田的最慢的是不是比king的最快的慢,三小于则与king的最快的比較: Tian Ji -- The Horse Racing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe

HDU 1052 Tian Ji -- The Horse Racing【贪心在动态规划中的运用】

算法分析: 这个问题很显然可以转化成一个二分图最佳匹配的问题.把田忌的马放左边,把齐王的马放右边.田忌的马A和齐王的B之间,如果田忌的马胜,则连一条权为200的边:如果平局,则连一条权为0的边:如果输,则连一条权为-200的边. 然而我们知道,二分图的最佳匹配算法的复杂度很高,无法满足N=2000的要求. 我们不妨用贪心思想来分析一下问题.因为田忌掌握有比赛的“主动权”,他总是根据齐王所出的马来分配自己的马,所以这里不妨认为齐王的出马顺序是按马的速度从高到低出的.由这样的假设,我们归纳出如下贪心

Tian Ji -- The Horse Racing(杭电1052)(贪心)

Tian Ji -- The Horse Racing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 18925    Accepted Submission(s): 5530 Problem Description Here is a famous story in Chinese history. "That was about