P3798
#include<bits/stdc++.h>
using namespace std;
struct student{
string name;
double diff;
}stu[100002];
int score[22];
bool cmp(student s1, student s2){
if(s1.diff!=s2.diff){
return s1.diff>s2.diff;
}
return s1.name<s2.name;
}
void show(int n){
int num = min(n, 20);
for(int i=1; i<=num; i++){
cout<<stu[i].name<<endl;
}
}
int main(){
int n,m;
scanf("%d %d", &n, &m);
for(int i=1; i<=n; i++){
cin>>stu[i].name;
memset(score, 0, sizeof(score));
double sum=0;
for(int j=1; j<=m; j++){
scanf("%d", &score[j]);
sum+=score[j];
}
double ave = sum/m;
double diff_sum = 0;
for(int j=1; j<=m; j++){
diff_sum += pow(score[j]-ave, 2);
}
stu[i].diff = sqrt(diff_sum/n);
}
sort(stu+1,stu+1+n,cmp);
show(n);
return 0;
}
注意本题不能用冒泡排序;用sort排序
方法
1
:
sort(
起始地址,末尾地址
+1)
;
方法
2
:
sort(
起始地址,末尾地址
+1
,
cmp)
;
//cmp
是自定义的排序规则
sort
是默认升序排序的,如果需要自定义排序,可以写一个比较函数,用第二种方法
排序
B3784
#include<bits/stdc++.h>
using namespace std;
int arr[102][100002];
// 结构体:用于存储每首歌的欢乐度
struct happy{
int sum; //欢乐度
int id; //歌曲编号
};
happy hp[100002]; // 计算每首歌的欢乐度:按照列来计算欢乐度
void cal(int rows, int cols){
for(int j=1; j<=cols; j++){
int s=0;
for(int i=1; i<=rows; i++){
s+=arr[i][j];
}
hp[j].id=j;
hp[j].sum=s;
}
}// 对所有的歌曲进行排序:按照欢乐度从高到低排
bool cmp(happy x, happy y){
return x.sum > y.sum;//降序排序
}// 单独计算 zyl 最喜欢的歌曲编号
int like(int cols, int row){
int maxn=-1, index=-1;
for(int j=1; j<=cols; j++){
if(arr[row][j]>maxn){
maxn=arr[row][j];
index=j;
}
}
return index;
}// 查找 zyl 最喜欢的歌曲是否在前 m 个中
bool search(int m, int index){
for(int i=1; i<=m; i++){
if(hp[i].id == index){
return true;
}
}return false;
}
int main(){
// freopen("t2.in", "r", stdin);
// freopen("t2.out", "w", stdout);
int n, m, a, b; //n-歌曲的总数,即:列数;m-要选的歌曲数,a-学生总人 数,即行数;b-学号
scanf("%d %d %d %d", &n, &m, &a, &b);
for(int i=1; i<=a; i++){
for(int j=1; j<=n; j++){
scanf("%d", &arr[i][j]);
}
}
cal(a, n); //计算每首歌的欢乐度 //注意:使用冒泡排序会超时!!
sort(hp+1, hp+1+n, cmp);
int index=like(n, b); //计算 zyl 最喜欢的歌曲编号
bool find = search(m, index);
if(find){
printf("%d ", index);
for(int i=1; i<=m; i++){
if(hp[i].id!=index){
printf("%d ", hp[i].id);
}
}
}
else{
for(int i=1; i<=m-1; i++){
printf("%d ", hp[i].id);
}
printf("%d", index);
}
return 0;
}
P1105
#include<bits/stdc++.h>
using namespace std;
int h[1003], l[1003], r[1003]; //分别存储每个台阶的高度、左端点、右端点
int main(){
// freopen("t3.in", "r", stdin);
// freopen("t3.out", "w", stdout);
int n;
scanf("%d", &n);
for(int i=1; i<=n; i++){
scanf("%d %d %d", &h[i], &l[i], &r[i]);
}
for(int i=1; i<=n; i++){
int left_no=0, right_no=0; //注意:这里必须每次都要给 left_no、 right_bo 赋初值// 从左端点掉下来
for(int j=1; j<=n; j++){
if(h[j]<h[i] && l[j]<l[i] && r[j]>l[i]){
if(h[j] > h[left_no]){ //取:距离掉下来的那个台阶最 高的台阶
left_no = j;
}
}
}// 从右端点掉下来
for(int j=1; j<=n; j++){
if(h[j]<h[i] && l[j]<r[i] && r[j]>r[i]){
if(h[j] > h[right_no]){ //取:距离掉下来的那个台阶最 高的台阶
right_no = j;
}
}
}
printf("%d %d\n", left_no, right_no);
}
return 0;
}