每日一题?(或者几题)

这次分享的是P1199 [NOIP 2010 普及组] 三国游戏,这也是一道有关贪心算法的题,但是贪心的不是我们,而是电脑。先贴一下代码。

#include <bits/stdc++.h>
using namespace std;

int main() {
    int N;
    cin >> N;
    
    vector<vector<int>> m(N + 1, vector<int>(N + 1, 0));
    for (int i = 1; i <= N; ++i) {
        for (int j = i + 1; j <= N; ++j) {
            cin >> m[i][j];
            m[j][i] = m[i][j];
        }
    }
    
    int max_second = 0;
    for (int i = 1; i <= N; ++i) {
        vector<int> moxies;
        for (int j = 1; j <= N; ++j) {
            if (i != j) {
                moxies.push_back(m[i][j]);
            }
        }
        sort(moxies.begin(), moxies.end(), greater<int>());
        if (moxies.size() >= 2 && moxies[1] > max_second) {
            max_second = moxies[1];
        }
    }
    
    cout << "1" << endl;
    cout << max_second << endl;
    
    return 0;
}

电脑为了不让玩家获胜,那么玩家选什么搭档他就会把默契最大的选了。那么既然最大的选不了,那么玩家要获胜自然,要比电脑大,可以就可以选第二大的。那么第二大的也不止一个,所以要先把每个搭档的第二大的比较一下,选择第二大中最大的。这样我们就可以得到一种必赢的方法,我们分别选择第二大中最大的两个,假设这两个搭档他们各自的其余搭档的默契,他们都不是最大的,那么计算机必然会选择其他搭档,不会有任何影响。如果这两个搭档他们各自的其余搭档的默契,他们有一个是最大的,这时我们就先选择不是最大的那个搭档,再选择另一个搭档,这样就可以避免计算机先选择。如果这两个搭档他们各自的其余搭档的默契,他们都是最大的,看似无解了,但这种情况不可能发生。因为如果都是最大,这个解就不可能是任何一个搭档的第二大,矛盾了,不会存在这种情况。所以玩家就可以采取这个必胜策略,那么玩家既然肯定能赢,代码只需要能找到第二大中的最大就行了,这样代码就简单了。

评论

  1. 棍母
    8 月前
    2025-7-28 22:37:09

    哦哦,哦哦哦!

发送评论 编辑评论


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