51Nod 2455 花园 c/c++题解

题目描述

花园中有一排五颜六色的花,顺次编号为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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值