HDU 1052(田忌赛马 贪心)
题意是田忌赛马的背景,双方各有n匹马,下面两行分别是田忌和齐王每匹马的速度,要求输出田忌最大的净胜场数*每场的赌金200。
开始的时候想对双方的马匹速度排序,然后比较最快的马,能胜则胜,否则用最慢的马去消耗对方,但这样存在问题:1 2 3 对 1 3 3的时候,会变成1 - 3,2 - 3,3 - 1,净胜-1场,而实际存在1 - 3,2 - 1,3 - 3的净胜0场的策略;
然后自然想到的是要对平局进行特殊处理,当双方最快的马能战平时,比较最慢马,如果最慢马能胜对方,就用最慢马胜对方,然后让两方最快马战平,但是:2 3 5 对 1 4 5的时候,会变成 2 - 1,3 - 4,5 - 5,净胜0场,而实际存在2 - 1,3 - 5,5 - 4的净胜1场的策略;
......
惊觉自己不断拆墙补墙的做法导致自己的策略不够完整,逻辑也不够严密,借鉴了别人的代码,才得出较为严密的策略:
以双方最慢的马比较,若田忌最慢的马比齐王最慢的马快,则本场用双方最慢的马比赛;若田忌最慢的马比齐王最慢的马慢,则本场用田忌最慢的马和齐王最快的马比赛;若两方最慢的马速度一样,则比较两方最快的马;若田忌最快的马快于齐王最快的马,本场用双方最快的马比赛,(若田忌最快的马和齐王最快的马一样快,暂不处理,保留;若田忌最快的马比齐王最快的马慢,则用田忌最慢的马去消耗齐王最快的马。)这里只比较田忌最慢的马和齐王最快的马即可。
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
int cnt,n,pafast,pbfast,paslow,pbslow,ans,a[],b[];
while(~scanf("%d",&n)&&n)
{
for(int i = ; i < n; i++) scanf("%d",&a[i]);
for(int i = ; i < n; i++) scanf("%d",&b[i]);
sort(a,a+n);
sort(b,b+n);
pafast = pbfast = n-;
paslow = pbslow = ;
ans = cnt = ;
for(int i = ; i < n; i++)
{
if(a[paslow] > b[pbslow]) //当前田忌慢马快于齐王慢马
{
paslow++;
pbslow++;
ans++;
}
else if(a[paslow] < b[pbslow]) //当前田忌慢马慢于齐王慢马,选择与齐王快马比
{
paslow++;
pbfast--;
ans--;
}
else //当前田忌慢马与齐王慢马一样
{
if(a[pafast] > b[pbfast]) // 当前田忌快马快于齐王快马
{
pafast--;
pbfast--;
ans++;
}
else if(a[paslow] < b[pbfast]) // 当前田忌慢马慢于齐王快马,选择与齐王快马比
{
paslow++;
pbfast--;
ans--;
}
}
}
printf("%d\n",ans*);
}
return ;
}
个人觉得非常漂亮的分析:https://www.cnblogs.com/anderson0/archive/2011/05/07/2039971.html
(希望以后也能写出如此漂亮的分析...)
HDU 1052(田忌赛马 贪心)的更多相关文章
- hdu 1052 田忌赛马
贪心,排序从大到小.. 先比大的.跑只是就拿最小的来送死.. , 假设是平局就比后面的... 若后面也是平局就拿去跟前面的去跑. .. #include<stdio.h> #include ...
- HDU 1052 Tian Ji -- The Horse Racing (贪心)(转载有修改)
Tian Ji -- The Horse Racing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- HDU 1052
http://acm.hdu.edu.cn/showproblem.php?pid=1052 田忌赛马本质就是一个贪心 res表示田忌的胜利场次 1.田忌最快马快于王的最快马,两个最快马比,res++ ...
- Tian Ji -- The Horse Racing HDU - 1052
Tian Ji -- The Horse Racing HDU - 1052 (有平局的田忌赛马,田忌赢一次得200块,输一次输掉200块,平局不得钱不输钱,要使得田忌得到最多(如果只能输就输的最少) ...
- Hdu 4864(Task 贪心)(Java实现)
Hdu 4864(Task 贪心) 原题链接 题意:给定n台机器和m个任务,任务和机器都有工作时间值和工作等级值,一个机器只能执行一个任务,且执行任务的条件位机器的两个值都大于等于任务的值,每完成一个 ...
- D - 淡黄的长裙 HDU - 4221(贪心)
D - 淡黄的长裙 HDU - 4221(贪心) James is almost mad! Currently, he was assigned a lot of works to do, so ma ...
- HDU 1052 Tian Ji -- The Horse Racing(贪心)(2004 Asia Regional Shanghai)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1052 Problem Description Here is a famous story in Ch ...
- HDU 1052 贪心+dp
http://acm.hdu.edu.cn/showproblem.php?pid=1052 Tian Ji -- The Horse Racing Time Limit: 2000/1000 MS ...
- HDU 1052 Tian Ji -- The Horse Racing(贪心)
题目来源:1052 题目分析:题目说的权值匹配算法,有点误导作用,这道题实际是用贪心来做的. 主要就是规则的设定: 1.田忌最慢的马比国王最慢的马快,就赢一场 2.如果田忌最慢的马比国王最慢的马慢,就 ...
随机推荐
- SPHINX 文档写作工具安装简要指南 - windows 版 - 基于python
此教程基于本地己安装好 PYTHON 并配置过全局变量:一定具备相应的基础再操作: 上传图片以免产生误导,以下为文字描述,按下列操作即可: 下载 get-pip.py脚本; python get-pi ...
- MT【251】椭圆中的好题
已知直线$l:x+y-\sqrt{3}=0$过椭圆$E:\dfrac{x^2}{a^2}+\dfrac{y^2}{b^2}=1,(a>b>0)$的右焦点且与椭圆$E$交于$A,B$两点,$ ...
- JLOI2015 DAY1 简要题解
「JLOI2015」有意义的字符串 题意 给你 \(b, d, n\) 求 \[ [(\frac{b + \sqrt d}2)^n] \mod 7528443412579576937 \] \(0 & ...
- C# 新语法收集
内联变量 使用int.tryparst时,先要申明变量,用于out参数 int d; int.tryparse(s,out d); 使用内联变量写法可以如下.功能一样简化了写化 int.trypars ...
- 生产者&消费者.py
1.最简单的 --生产者消费者 send.py# !/usr/bin/env python3.5# -*- coding:utf-8 -*-# __author__ == 'LuoTianShuai' ...
- django 模板语言
母版与继承: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- 搭建简易的WebServer(基于pyhton实现简易Web框架 使用socket套接字)
1. 使用web底层socket的方式实现简易服务器的搭建,用来理解学习 # 1.导入socket模块 import socket import re import gevent import sys ...
- Java线程池中submit()和execute之间的区别?
一: submit()方法,可以提供Future < T > 类型的返回值. executor()方法,无返回值. execute无返回值 public void execute(Runn ...
- bzoj4566 找相同字符
题意:给定两个字符串,从中各取一个子串使之相同,有多少种取法.允许本质相同. 解:建立广义后缀自动机,对于每个串,分别统计cnt,之后每个点的cnt乘起来.记得开long long #include ...
- A1011. World Cup Betting
With the 2010 FIFA World Cup running, football fans the world over were becoming increasingly excite ...