返回顶部

2019 Multi-University Training Contest 8

1010 Quailty and CCPC

签到题,但是好像踩了一些什么坑。就是nth_element的应用,要注意nth_element的时候,n是从0开始的。测试如下:

计数从1开始,生成1~100然后打乱。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int main() {
#ifdef Yinku
    freopen("Yinku.in", "r", stdin);
#endif // Yinku
    int n=100;
    int a[105];
    for(int i=1;i<=n;++i)
        a[i]=i;
    random_shuffle(a+1,a+1+n);
    int k=50;
    nth_element(a+1,a+1+(k-1),a+1+n);
    for(int i=1;i<=n;++i){
        printf(" %d",a[i]);
    }
    puts("");
    printf("kth: %d\n",a[k]);
}

意思是,计算机里面的计数都是从0开始的,所以人类说的第50个,在调用nth_element的时候,中间要传进去的是50-1,当然我们的首地址既然是a+1那a+1是不能改的。

但是假如计数从0开始就会变成这样?

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int main() {
#ifdef Yinku
    freopen("Yinku.in", "r", stdin);
#endif // Yinku
    int n=100;
    int a[105];
    for(int i=0;i<n;++i)
        a[i]=i+1;
    random_shuffle(a,a+n);
    int k=50;
    nth_element(a,a+(k-1),a+n);
    for(int i=0;i<n;++i){
        printf(" %d",a[i]);
    }
    puts("");
    printf("kth: %d\n",a[k-1]);
}

从0开始的人类说的第k个当然是要取第k-1了!

所以得到的就是:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

struct Pl {
    char s[100];
    int p, t;
    bool operator<(const Pl& pl)const {
        if(p != pl.p)
            return p > pl.p;
        else
            return t < pl.t;
    }
} pl[100005];

int main() {
#ifdef Yinku
    freopen("Yinku.in", "r", stdin);
#endif // Yinku
    int T;
    scanf("%d", &T);
    while(T--) {
        int n, d;
        scanf("%d%d", &n, &d);
        for(int i = 1; i <= n; ++i) {
            scanf("%s%d%d", pl[i].s, &pl[i].p, &pl[i].t);
        }
        if(n * d % 10 == 5) {
            int k2 = (n * d / 10) + 1;
            nth_element(pl + 1, pl + 1 + (k2 - 1), pl + 1 + n);
            printf("%s\n", pl[k2].s);
        } else {
            puts("Quailty is very great");
        }
    }
}

Acesrc and Cube Hypernet
1011 Roundgod and Milk Tea

posted @ 2019-08-20 14:55  Inko  阅读(160)  评论(0编辑  收藏  举报