B3798 B3784 P1105

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; 
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值