花园中有一排五颜六色的花,顺次编号为1…n,编号为i的花的颜色为ci,同时每一朵花有一个美丽值,美丽值越大那么这朵花就越漂亮,其中编号为i的花的美丽值为bi。现在花园的主人提出m个问题,如果你都能回答上来,这些花就全部送给你。这m个问题均以c,k的形式给出,意思是主人想知道颜色为c的那些花中美丽值第k大的编号为多少(1…n中的一个数)。
花园主人向你保证:不存在两朵颜色和美丽值都完全相同的花,且主人的问题都一定有解
输入
第一行:一个数n(10<=n<=1000),表示花的数量
第2~n+1行:每行两个数字c b(1<=c<=10,1<=b<=10^9),表示花的颜色和漂亮程度(对应编号1到n的花)
第n+2行:一个数m(10<=m<=100),表示m次询问
第n+3~n+m+2行:每行两个数字c k,表示询问颜色为c的花中美丽值第k大的编号为多少
输出
共m行:输出一个数字,表示对应询问的答案
输入样例
6
1 5
1 2
1 8
2 3
2 9
3 1
4
1 2
1 3
2 2
3 1
输出样例
1
2
4
6
题解:
题目说的是输出对应的c中b 第k大的 花的编号,所以我是直接开个结构体保存c、b、num(编码),然后按照c排序,c相等就b从大到小排序,对应每一个(c,k)都遍历一次flower数组,如果遇到了c,我就i继续往后移动k-1次,就可以得到对应c中第k大的花的编号num。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <deque>
#include <list>
#include <utility>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <bitset>
#include <iterator>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double PI = acos(-1.0);
const double E = exp(1.0);
const int MOD = 1e9+7;
const int MAX = 1e3+5;
int n;
struct Flower
{
int num;
int c,b;
}flower[MAX];
int m;
int c,k;
int cmp(const Flower A,const Flower B)
{
if(A.c != B.c)
{
return A.c < B.c;
}
else
{
return A.b > B.b;
}
}
int main()
{
/*
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
*/
cin >> n;
for(int i = 1; i <= n; i++)
{
flower[i].num = i;
cin >> flower[i].c >> flower[i].b;
}
sort(flower+1,flower+n+1,cmp);
cin >> m;
while(m--)
{
cin >> c >> k;
for(int i = 1; i <= n; i++)
{
if(flower[i].c == c)
{
for(int j = 1; j <= k-1; j++)
{
i++;
}
cout << flower[i].num << endl;
break;
}
}
}
return 0;
}