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

被折叠的 条评论
为什么被折叠?



