7-1 h0168. 田忌赛马
分数 10
全屏浏览题目
切换布局
作者 黄正鹏
单位 贵州工程应用技术学院
田忌与齐王赛马,双方各有n匹马参赛,每场比赛赌注为200两黄金,现已知齐王与田忌的每匹马的速度,并且齐王肯定是按马的速度从快到慢出场,现要你写一个程序帮助田忌计算他最好的结果是赢多少两黄金。
说明: 为了简单起见,保证2n匹马的速度均不相同。
输入格式:
输入每组测试数据占3行,第一行是n(n<=1000),表示双方参赛马的数量,第2行n个正整数,表示田忌的马的速度,第3行n个正整数,表示齐王的马的速度.测试数据以“0”结束。
输出格式:
每组测试数据输出一行数据,表示田忌比赛的最好结果是赢多少两黄金。
输入样例:
3
92 83 71
95 87 74
2
20 20
20 20
2
20 19
22 18
0
输出样例:
200
0
0
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
//类似于动态规划,找到贪心属性即可,即经典田忌赛马的老六思想
#include<iostream>
#include<algorithm>
using namespace std;
int a[100], b[100];//a是田忌,b是秦王
void SelectSort(int* a, int len)
{
for (int i = 0; i < len; i++)
{
int temp = a[i];
int min = i;
for (int j = i+1; j < len; j++)
{
if (a[j] < temp)
{
min = j;
temp = a[j];
}
}
if (min != i)
{
swap(a[i], a[min]);
}
}
}
int main()
{
int n, fastT, fastQ, slowT, slowQ,money;//定义上等马和下等马以及“钱钱”
while (cin >> n && n != 0)//连续输入多组数据
{
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
for (int i = 0; i < n; i++)
{
cin >> b[i];
}
slowT = 0;
slowQ = 0;
fastT = n - 1;
fastQ = n - 1;
money = 0;
SelectSort(a, n);//选择排序将马儿排位
SelectSort(b, n);
for (int i = 0; i < n; i++)//贪心属性为如果上等马打得过上等马,钱钱加一
//,子序列缩短,下等马同理//若都不行,只能劣等打上等,钱钱减一
{
if (a[fastT] > b[fastQ])
{
money++;
fastT--;
fastQ--;
}else
if (a[slowT] > b[slowQ])
{
money++;
slowT++;
slowQ++;
}
else
if(a[slowT]<b[fastQ])
{
money--;
fastQ--;
slowT++;
}
}
cout << money * 200 << endl;//最后输出钱钱
}
}