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