萌新第一次自主AC贪心绿题,虽然有点水这题。
#include <bits/stdc++.h>
using namespace std;
int ah[25010]; //输入前半部分
int al[25010]; //输入后半部分
int vis[100050]; // vis[i]=1 代表i在a数组中,或者已经使用过了的牌,不会出现在后续的b数组中
int b[50050]; // elsie手中剩下的牌
//思路:第一步 前半部分从大到小排序 然后把b数组的所有数字从大到小排序 然后详细操作见代码
//第二步 把第一步使用过牌的从b数组删除,用b数组表示手中剩下的牌
// 把后半部分也从大到小排序 跟第一步相反 详见代码
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n / 2; i++) //输入前半部分
{
cin >> ah[i];
vis[ah[i]] = 1; //在a数组中的牌记录一下,记录下来的牌不会出现在elsie手中
}
for (int j = 1; j <= n / 2; j++) //输入后半部分
{
cin >> al[j];
vis[al[j]] = 1; //同理
}
sort(ah + 1, ah + n / 2 + 1, greater<int>()); //从大到小排序
sort(al + 1, al + n / 2 + 1, greater<int>()); //从大到小排序
int cnt = 0;
for (int i = 1; i <= n * 2; i++) //统计elise手中的牌
{
if (!vis[i])
b[++cnt] = i;
}
sort(b + 1, b + cnt + 1, greater<int>()); //排序
int fl = 1; //开始贪心
int ans = 0;
for (int i = 1; i <= n / 2; i++)
{
if (b[fl] > ah[i])
{
ans++;
vis[b[fl]] = 1; //打出的牌记录一下
fl++;
}
}
cnt = 0;
for (int i = 1; i <= n * 2; i++) //统计elise手中的牌
{
if (!vis[i])
{
b[++cnt] = i;
}
}
//贪心同理 只不过相反
sort(b + 1, b + cnt + 1, greater<int>());
fl = 1;
for (int i = 1; i <= cnt; i++)
{
if (b[i] < al[fl])
{
ans++;
fl++;
vis[i] = 1;
}
}
cout << ans << endl;
return 0;
}