题目链接
题目大意:
在 2 * n -1 个盒子里,有 苹果 和 橘子 ,每个盒子 从 1 开始编号 , 让你挑选 n 个盒子,并且里面的苹果数量不少于总苹果的数量,橘子的数量也不少于总橘子的数量
解题思路:
一开始我写了两个排序。。。然后 wa2 了 ,看了题解,哦,思维题
把 苹果 从小到大 排序,然后排完序后的奇数位置的苹果 一定是 大于偶数 位置的 苹果的
比如 a[1] + a[3] + a[5] > a[2] + a[4]
因为 a[5] > a[4] , a[3] > a[2] 还多了个 a[1]
或者 偶数位置的加上最后位置的 一定大于其它位置的
比如 a[2] + a[4] + a[5] > a[1] + a[3]
因为 a[2] > a[1] , a[4] > a[3] 还多了个 a[5]
这样苹果任意一种都满足了 选择哪种就看橘子了
橘子呢 先统计下橘子的总数量 然后 按照第一种统计下橘子的数量 即所有奇数位置的橘子数量 如果满足条件 就输出位置
不然 就输出偶数位置加 最后一个 肯定是满足的
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e6;
long long a[maxn];
struct node
{
int d;
long long a;
long long o;
}e[maxn];
bool cmp(node x,node y)
{
return x.a<y.a;
}
int main()
{
int t;
int n;
int i,j;
cin>>t;
long long ans=0;
long long sum=0;
while(t--)
{
cin>>n;
sum=0;
ans=0;
for(i=1;i<=2*n-1;i++)
{
cin>>e[i].a>>e[i].o;
e[i].d=i;
sum+=e[i].o;
}
sort(e+1,e+2*n,cmp);
cout<<"YES"<<endl;
for(i=1;i<=2*n-1;i++)
{
if(i%2!=0)
ans+=e[i].o;
}
if(ans*2>=sum)
{
for(i=1;i<=2*n-1;i++)
{
if(i%2)
{
cout<<e[i].d<<" ";
}
}
cout<<endl;
}
else
{
for(i=1;i<=2*n-1;i++)
{
if(i%2==0)
{
cout<<e[i].d<<" ";
}
}
cout<<e[2*n-1].d<<endl;
}
}
return 0;
}