鎕鎕有 2n + 1 张卡片,每张卡片上都有两个数字,第 i 张卡片上的两个数字分别是 Ai 与 Bi。
现在鎕鎕要从所有卡片中选出恰好 n + 1 张卡片,然后计算他选出的所有卡片中 Ai 的和与 Bi 的和。他的目的是要使他选出的卡片的Ai 的和与 Bi 的和,都要分别大于剩下 n 张没选的卡片的 Ai 的和与 Bi 的和。
鎕鎕最近沉迷于玩 Switch,所以他希望你能帮他解决这个问题。
Input
输入第一行是一个整数 n,意义如以上所示。
接下来有 2n + 1 行,每行为两个正整数,第 i 行的两个正整数分别代表 Ai 和 Bi。
数据保证 1 ≤ n ≤ 100000,1 ≤ Ai, Bi ≤ 109。
Output
如果无法选出 n + 1 张卡片满足鎕鎕的要求,输出一个数 -1。否则输出 n + 1 行,每行有一个正整数,表示选出的卡片编号(从 1 开始)。如果有多解,输出任意一组解均可。
Sample Input
2
4 2
9 4
5 3
7 5
8 1
Sample Output
3
4
2
先将ai排序,从小到大,在每2个之间选择 bi大的,所以b一定满足,每2个为一组,第一组的a一定比第二组的a小,倒数第二组的a一定比最后一个a小,所以未选的和一定比总共的a小,故好像可能一定绝对必须差不多满足;
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
const int N = 3*100005;
int inde[N];
struct p
{
int a,b;
int pos;
}t[N];
bool cmp(p x,p y)
{
return x.a<y.a;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=2*n+1;i++)
{
cin>>t[i].a>>t[i].b;
t[i].pos=i;
}
sort(t+1,t+1+2*n+1,cmp);
int in=1;
for(int i=1;i<=2*n;i+=2)
{
if(t[i].b<t[i+1].b)
inde[in++]=t[i+1].pos;
else
inde[in++]=t[i].pos;
}
inde[in++]=t[2*n+1].pos;
for(int i=1;i<in;i++)
cout<<inde[i]<<endl;
return 0;
}