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
",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
",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
", pl[k2].s);
} else {
puts("Quailty is very great");
}
}
}
Acesrc and Cube Hypernet
1011 Roundgod and Milk Tea