B3798 B3784 P1105 P1055 B3680 P1029

B3798

注意注意:本道题不能使用冒泡排序法,否则会超时。使用sort()排序法。

注意:1.若人数超过二十人,只需输出前二十个人。

            2.排序时先按标准差,再按照姓名的字典序。

            3.算标准差时需要使用double类型的变量。

            4.使用结构体存储每一名学员的名字和标准差。

完整代码如下:

#include<bits/stdc++.h>
using namespace std; 
struct student{ 
 	string name;
	double diff; 
};
student 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; 
}

B3784 

用结构体记录同学的欢乐度和编号,从高到低排。

代码如下:

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

注意:单独计算zyl最喜欢的音乐编号

代码如下:

bool cmp(happy x, happy y){
	return x.sum > y.sum;
}

完整代码如下:

#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;
}
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;
}
bool search(int m, int index){
	for(int i=1; i<=m; i++){
		if(hp[i].id == index){
			return true;
		}
	}
	return false;
}
int main(){
	int 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);
	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

记录每个平台的高度,左右端点和id,判断平台会不会相交。

判断是否会出现重叠的平台。

可以将其想象成一个二维坐标系,在坐标系上画出相应的线段,再分别计算从左边和右边掉下来的例子。

完整代码如下:

#include<bits/stdc++.h>
using namespace std;
int h[1003], l[1003], r[1003];
int main(){
	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;
		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;
}

P1055

计算除最后的一个验证码外所有的要求计算的和,使用for循环,用sum储存,最后用sum%11,判断sum%11的值与10的关系,等于10则让最后的验证码等于X,小于10求sum对应的字符,与最后一位验证码比较。

完整代码如下:

#include<bits/stdc++.h>
using namespace std;
char ch[18];
int main(){
	cin>>ch;
	int index=1;
	int sum=0;
	for(int i=0;i<=10;i++){
		if(ch[i]!='-'){
			sum+=(ch[i]-'0')*index;
			index++;
		}
	}
	char ch1;
	sum%=11;
	if(sum==10){
		ch1='X';
	}
	else{
		ch1=sum+'0';
	}
	if(ch1==ch[12]){
		cout<<"Right"<<endl;
	}
	else{
		ch[12]=ch1;
		cout<<ch<<endl;
	}
	return 0;
}

P1029

本道题使用到一个公式:两个数的最小公倍数=两个数的乘积除以两个数的最大公约数。

求最大公约数使用到辗转相除法,过程代码如下:

int gcd(int m,int n){
	int r=m%n;
	while(r!=0){
		m=n;
		n=r;
		r=m%n;
	}
	return n;
}

格外要注意如果找到的两个数不相等,计数器要+2(因为两个数可以互换位置)

完整代码如下:

#include<bits/stdc++.h>
using namespace std;
int gcd(int m,int n){
	int r=m%n;
	while(r!=0){
		m=n;
		n=r;
		r=m%n;
	}
	return n;
}
int main(){
	int x,y;
	scanf("%d %d",&x,&y);
	int ans=0;
	long long ji=x*y;
	for(int m=x;m<=sqrt(ji);m+=x){
		if(ji%m==0){
			int n=ji/m;
			if(gcd(m,n)==x){
				if(m!=n){
					ans+=2;

				}
				else{
					ans+=1;
				}
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值