CF1956B Nene and the Card Game

前言

题目算比较简单的思维题目,很符合 CF 的出题特点。

题目大意

现在有 $1$ 到 $n$ 的牌每个两张。你现在有 $n$ 张,并且在输入中给出。另一个人有剩下的 $n$ 张牌。

你和那个人进行一个游戏:

  1. 两人轮流。你先手,另一个人后手。一共进行 $2 \times n$ 轮。
  2. 每轮的那个人需要出一张牌。
  3. 如果那张牌上的数字是之前出过的,那么这个人的一分,否则不得分。
  4. 牌出完后就扔掉,无论你有没有得分。

注意每个人都可以看见出过的牌。

思路

我们假设第一个人有 $s$ 对相同的牌。

那么这个人就有 $n – 2s$ 张不成对的牌。

那么你也有 $n – 2s$ 张不成对的牌。

所以你有 $\frac{n – (n – 2s)}{2} = s$ 对相同的牌。(修正了一下楼上的题解)。

我们发现两个人有着相同多对的牌,所以我们可以发现一个这样的后手必胜策略:

  1. 两个人都把对子出完,两个人各得 $s$ 分。
  2. 由于现在两个人的牌都是完全一样的了,所以每次先手出了一张牌的时候,后手就可以出相同的牌,这样后手就得分了。

所以,在两个人都极其聪明的情况下,最后的得分是:

先手 $s$ 分,后手 $n-2s+s=n-s$ 分。

由于 $s$ 一定小于 $n$ 的一半,所以答案只用输出 $s$ 就行了。

代码

#include <bits/stdc++.h>

using namespace std;
int a[200005];
int main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int T; cin >> T;
    while (T --) {
        int n; cin >> n;
        for (int i = 1; i <= n; i ++) cin >> a[i];
        sort(a + 1, a + n + 1);
        int same = 0;
        for (int i = 1; i <= n; i ++) if (a[i] == a[i - 1]) same ++;
        cout << same << "\n";
    }
    return 0;
}

AC 记录:https://codeforces.com/contest/1956/submission/256619999

本文链接:https://ztrztr.top/archives/446
版权声明:本文 《CF1956B Nene and the Card Game》 为 ztrztr 原创。著作权归作者所有。
转载说明:联系作者或者评论区留言获得转载授权,并注明转载地址。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇