1.题目描述:
两个人打牌,第一个人按牌顺序出,每轮胜者可以弹负者脑瓜崩,如果平局则无效,问你第二个人被弹的最小值和弹第一个人的最大值
首先是要弹第一个人的最大次数,那么对于第一个人出的每一张牌,第二个人应该贪心地找大于它牌最小的那张,如果没有则表示这轮他不可能获胜,则出最小牌就好了
然后是要被弹的最小次数,也是一样的,尽可能多的平局
3.AC代码:
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define maxn 100100
#define N 1111
#define eps 1e-6
#define pi acos(-1.0)
#define e 2.718281828459
#define mod (int)1e9 + 7
using namespace std;
typedef long long ll;
char a[N], b[N];
int vis1[10], vis2[10];
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
long _begin_time = clock();
#endif
int n;
while (~scanf("%d", &n))
{
scanf("%s%s", a, b);
memset(vis1, 0, sizeof(vis1));
memset(vis2, 0, sizeof(vis2));
for (int i = 0; i < n; i++)
{
vis1[b[i] - '0']++;
vis2[b[i] - '0']++;
}
int ans1 = 0, ans2 = 0;
for (int i = 0; i < n; i++)
{
int x = a[i] - '0', flag = 0;
for (int j = x; j < 10; j++) //不被弹脑瓜崩
if (vis1[j])
{
vis1[j]--;
flag = 1;
break;
}
if (!flag)
{
ans1++;
for (int j = 0; j < x; j++) // 只能被弹的话 出最小的牌
if (vis1[j])
{
vis1[j]--;
break;
}
}
flag = 0;
for (int j = x + 1; j < 10; j++) //最大化弹别人
if (vis2[j])
{
vis2[j]--;
ans2++;
flag = 1;
break;
}
if (!flag)
{
for (int j = 0; j <= x; j++) // 弹不了出最小牌
if (vis2[j])
{
vis2[j]--;
break;
}
}
}
printf("%d\n%d\n", ans1, ans2);
}
#ifndef ONLINE_JUDGE
long _end_time = clock();
printf("time = %ld ms.", _end_time - _begin_time);
#endif
return 0;
}