输入输出样例
2
1
3
2
4
2 0
6
10000000
10000000
10000000
10000000
10000000
10000000
0
0
0
0
0
0
12 12
样例说明
- 我们分别称 4 位选手为 A,B,C,D 。则可能出现以下 4 种对战方式,最好情况下可得 2 分,最坏情况下得 0 分。
| 浙江 | ??? | 结果 | 浙江 | ??? | 结果 | 浙江 | ??? | 结果 | 浙江 | ??? | 结果 |
---|
一号 | A | B | 负 | A | D | 负 | B | C | 胜 | B | D | 负 |
二号 | B | D | 负 | B | C | 胜 | A | D | 负 | A | C | 负 |
得分 | | | 0 | | | 2 | | | 2 | | | 0 |
- 对手都是认真学习的好孩子,不会打游戏。无论如何排列出场顺序都无法改变被蹂躏的结果。浙江队总能取得全胜的结果。
一道博弈论贪心题:
- 我方最小的
≮
\not<
<
≠
\not=
=
>
>
> 他方最小的
if(a[h]>b[l]) {
ans+=2;
h++;
l++;
}
- 我方最大的
≮
\not<
<
≠
\not=
=
>
>
> 他方最大的
else if(a[t]>b[r]) {
ans+=2;
t--;
r--;
}
- 我方最小的
≮
\not<
<
=
=
=
≯
\not>
>他方最大的
else {
ans+=a[h]==b[r];
h++;
r--;
}
while(h<=t&&l<=r) {
if(a[h]>b[l]) {
ans+=2;
h++;
l++;
} else if(a[t]>b[r]) {
ans+=2;
t--;
r--;
} else {
ans+=a[h]==b[r];
h++;
r--;
}
}
代码如下
#include <bits/stdc++.h>
#define maxn 1000039
#define ll long long
#define fori for(register int i=1;i<=N;i++)
#define forj for(register int j=1;j<=N;j++)
#define fork for(register int k=1;k<=N;k++)
int a[maxn],b[maxn];
int N;
int h,t,l,r;
long long ans;
inline void read(int &x) {
char s=getchar();
int f=1;
x=0;
while(s<'0'||s>'9') {
if(s=='-') f=-1;
s=getchar();
}
while(s>='0'&&s<='9') x=(x<<3)+(x<<1)+(s^48),s=getchar();
x*=f;
}
inline long long game(int a[],int b[]) {
h=1,t=N ,l=1,r=N,ans=0;
while(h<=t&&l<=r) {
if(a[h]>b[l]) {
ans+=2;
h++;
l++;
} else if(a[t]>b[r]) {
ans+=2;
t--;
r--;
} else {
ans+=a[h]==b[r];
h++;
r--;
}
}
return ans;
}
int main() {
read(N);
fori {
read(a[i]);
}
fori {
read(b[i]);
}
std::sort(a+1,a+1+N);
std::sort(b+1,b+1+N);
printf("%d ",game(a,b));
printf("%d",2*N-game(b,a));
return 0;
}