程序填空题:求解田忌赛马问题(贪心法)
齐威王与大将田忌赛马。双方约定每人各出300匹马,并且在上、中、下三个等级中各选一匹进行比赛,由于齐威王每个等级的马都比田忌的马略强,比赛的结果可想而知。现在双方各n匹马,依次派出一匹马进行比赛,每一轮获胜的一方将从输的一方得到200银币,平局则不用出钱,田忌已知所有马的速度值并可以安排出场顺序,问他如何安排比赛获得的银币最多。
```c++
#include
#include
using namespace std;
#define MAX 1001
//问题表示
int n;
int a[MAX];
int b[MAX];
//求解结果表示
int ans;
void solve() //求解算法
{
sort(a,a+n); //对a递增排序
sort(b,b+n); //对b递增排序
ans=0;
int lefta=0,leftb=0;
int righta=n-1,rightb=n-1;
while () //比赛直到结束
{
if (a[righta]>b[rightb]) //田忌最快的马比齐威王最快的马快,两者比赛
{
ans+=200;
;
;
}
else if (a[righta] {
ans-=200;
;
;
}
else //田忌最快的马与齐威王最快的马的速度相同
{
if (a[lefta]>b[leftb]) //田忌最慢的马比齐威王最慢的马快,两者比赛
{
ans+=200;
;
;
}
else
{
if (a[lefta] ans-=200;
;
;
}
}
}
}
int main()
{
scanf("%d",&n);
for (int i=0;i scanf("%d",&a[i]);
for (int j=0;j scanf("%d",&b[j]);
solve();
printf("%d\n",ans);
return 0;
}
```
### 输入样例:
第一行正整数n(n≤1000)马的数量,后两行分别是n个整数,表示田忌和齐威王的马的速度值。
```in
3
92 83 71
95 87 74
```
### 输出样例:
每个测试用例输出一行,表示田忌获得的最多银币数。
```out
200
```
答案:
第1空:lefta<=righta
第2空:righta--
第3空:rightb--
第4空:lefta++
第5空:rightb--
第6空:lefta++
第7空:leftb++
第8空:lefta++
第9空:rightb--
```c++
#include
#include
using namespace std;
#define MAX 1001
//问题表示
int n;
int a[MAX];
int b[MAX];
//求解结果表示
int ans;
void solve() //求解算法
{
sort(a,a+n); //对a递增排序
sort(b,b+n); //对b递增排序
ans=0;
int lefta=0,leftb=0;
int righta=n-1,rightb=n-1;
while () //比赛直到结束
{
if (a[righta]>b[rightb]) //田忌最快的马比齐威王最快的马快,两者比赛
{
ans+=200;
;
;
}
else if (a[righta] {
ans-=200;
;
;
}
else //田忌最快的马与齐威王最快的马的速度相同
{
if (a[lefta]>b[leftb]) //田忌最慢的马比齐威王最慢的马快,两者比赛
{
ans+=200;
;
;
}
else
{
if (a[lefta] ans-=200;
;
;
}
}
}
}
int main()
{
scanf("%d",&n);
for (int i=0;i
for (int j=0;j
solve();
printf("%d\n",ans);
return 0;
}
```
### 输入样例:
第一行正整数n(n≤1000)马的数量,后两行分别是n个整数,表示田忌和齐威王的马的速度值。
```in
3
92 83 71
95 87 74
```
### 输出样例:
每个测试用例输出一行,表示田忌获得的最多银币数。
```out
200
```
答案:
第1空:lefta<=righta
第2空:righta--
第3空:rightb--
第4空:lefta++
第5空:rightb--
第6空:lefta++
第7空:leftb++
第8空:lefta++
第9空:rightb--