一:杭电原题摘录
http://acm.hdu.edu.cn/game/entry/problem/show.php?chapterid=1§ionid=3&problemid=4
二.题目分析
田忌赛马的故事我们都知道,总共有三匹马,用自己最差的马和齐王的最好的马比.举个三匹马田忌能赢的例子
田忌 | 齐王 | 胜利方 |
92 | 95 | 齐王 |
83 | 87 | 齐王 |
71 | 74 | 田忌 |
那调整策略之后
田忌 | 齐王 | 胜利方 |
71 | 95 | 齐王 |
92 | 87 | 田忌 |
83 | 74 | 田忌 |
这个例子很简单,为什么要废话一堆,还画两个表格.
我想让大家体会到策略的数学模型化.就是怎么用数学语言来表达这个策略?还有就是田忌的策略到底全不全?因为我们是站在通用的法则之上,一个部分对的答案在逻辑上站不住脚,更不用说在此基础上进行的编程.
但至少这个例子可以让我们管中窥豹,可见一斑.
首先,我们必须先将两家的马匹性能数据按从大到小排列,排序在分析某些特性问题上的关键性已经不想在重复.刚刚田忌那个策略是一个;
然后呢?如果田忌的最好的马匹比齐王最好的马匹好那么你说他会不会拿自己这匹马和齐王其它的(也就不是最好的任一个比)比,很显然不会.直接刚就完事了;
还有呢?如果田忌的最差的马匹比齐王最差的马匹好那么你说他会不会拿自己这匹马和齐王其它的比,有些人说我跟齐王最好的马比啊.你忘了那个策略的前提是:田忌的马整体上性能没有齐王的好.最差的马什么时候都有.我们为什么不放到我们最差的马比齐王最差的马还要差的时候,再想骚操作呢?
骚操作是在实力不行的时候想的,当我们实习整体上比别人强的时候为什么不直接刚呢?这又不是三国,只是田,齐两方的争斗.这才是完整的策略.这不就是中美贸易战美方硬刚的原因.(题外话,一不小心偏了...)
三.我的收获
在想全策略的基础上,还要能转化为编程语言(显然前者更重要)
四.AC代码
#include<cstdio>
#include<algorithm>
using namespace std;
int cmp(int a,int b)
{
return a>b;
}
int main()
{
int a[1005],b[1005];
int n;
while(scanf("%d",&n),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,cmp);
sort(b,b+n,cmp);
int TFirst=0,QFirst=0;
int TEnd=n-1,QEnd=n-1;
int win=0;
while(n--)
{
if(a[TFirst]>b[QFirst])//田忌最快的马比齐王最快的快
{
TFirst++,QFirst++;
win++;
}
else if(a[TEnd]>b[QEnd])//田忌最慢的马比齐王最慢的快
{
TEnd--,QEnd--;
win++;
}
else if(a[TEnd]<b[QFirst])//用田忌最慢的马与齐王最快的马比
{
win--,TEnd--;
QFirst++;
}
}
printf("%d\n",win*200);
}
return 0;
}