【做题笔记】2017.12.25

P1031均分纸牌

普及难度(

也想了很久,一开始想的是先找最大的,往两边推;后来觉得如果是最大的,最小的(负最大的)应该是对称的,所以应该无所谓推的顺序。(尽管没有经过严格的证明,水过去了……)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<stdio.h>
#include<stdlib.h>
int main(){
int i,n,a[200]={0};
int b[200]={0};
int sum=0,cnt=0;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
sum+=a[i];
}
sum/=n;
for(i=1;i<=n;i++){
b[i]=a[i]-sum;
}
int j=n;
while(b[j]==0)j--;
while(b[i]==0)i++;
for(i=1;i<j;i++){
while(b[i]==0)i++;
//if(b[i]!=0)cnt++;
b[i+1]+=b[i];
cnt++;
}
printf("%d\n",cnt);
return 0;
}

P1059明明的随机数

很水的排序,顺手当练快排了


P1781宇宙总统

这题看似很水,字符串处理这里还出了点问题,花了点工夫调出来……

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    #include<stdio.h>
#include<stdlib.h>
struct node{
char a[200];
int num;
};
int big(char a[],char b[]){//a>b 1
int la=strlen(a),lb=strlen(b);
if(strcmp(a,b)==0)return 0;
if(la>lb)return 1;
if(la<lb)return 0;
if(la==lb){
for(int i=0;i<la;i++)
if(a[i]>b[i])return 1;
else if(a[i]<b[i])return 0;
}
return 0;
}
int main(){
int n,i;
struct node max,t;
strcpy(max.a,"0");
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%s",t.a);
t.num=i;
if(big(t.a,max.a))max=t;
}
printf("%d\n%s",max.num,max.a);
return 0;
}