咱又开始复习c语言哩,历史是个循环呢。

集合表示方法

没有优化过

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int find[100000];  // find[] is a global variabel,it is union,or in C  
int get_father(int a){
if(find[a]==a){
return a;
}
return get_father(find[a]);
}
void merge(int a,int b){
find[a] = b;
}
void init(int n){
int i;
for(i=1;i<=n;i++){
find[i]=i;
}
}

复试机试模拟

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
# include <stdio.h>
# include <ctype.h>
int cmp(const void *a,const void *b){
// qsort compare function
return *(char *)a-*(char *)b;
}
//int flag[1000000]={0};
//char ss[1000000];
int find[100000]; // find[] is a global variabel,it is union,or in C
int get_father(int a){
if(find[a]==a){
return a;
}
return get_father(find[a]);
}
void merge(int a,int b){
find[a] = b;
}
void init(int n){
int i;
for(i=1;i<=n;i++){
find[i]=i;
}
}
int main(){
int n,m;
int i,j;
int T;
scanf("%d",&T);
while(T--){
int num=0;
scanf("%d %d",&n,&m);
init(n);
for(i=1;i<=m;i++){
int a,b;
scanf("%d %d",&a,&b);
merge(a,b);
}
for(i=1;i<=n;i++){
if(find[i]==i){
num++;
}
}
printf("%d\n",num);
}
return 0;
}
int main5(){
int T;
int i,j;
scanf("%d",&T);
while(T!=0){
T--;
int x1, y1, x2, y2, x3, y3;
scanf("%d %d %d %d %d %d",&x1,&y1,&x2,&y2, &x3, &y3);
// L1=CA
// L2=CB
float t = (x3-x1)*(x3-x2)+(y3-y1)*(y3-y2);
//(x3-x1,y3-y1) (x3-x2,y3-y2)
if(t>0){
printf("Acute");
}
if(t==0){
printf("Right");
}
if(t<0){
printf("Obtuse");
}
printf("\n");
}

return 0;
}



int main4()
{
int a[128]={0};
//printf("%d\n",toascii('a')); // 需要用到#include <ctype.h>函数库
int i,j;
char s1[1000];
char s2[1000];
gets(s1);
gets(s2);
int flag=0;
for(i =0;i<strlen(s2);i++){
if(s2[i]>=65&&s2[i]<=91){
a[toascii(s2[i])+32]=1;
}
a[toascii(s2[i])]=1;
}
for(i=0;i<strlen(s1);i++){
if(s1[i]>=65&&s1[i]<=91){ //大写字母
if( a[toascii(s1[i])+32]!=1){
flag=1;
printf("%c",s1[i]);
}
}
else{
if(a[toascii(s1[i])]!=1){
flag=1;
printf("%c",s1[i]);
}
}
}
if(flag==0){
printf("Blank");
}
printf("\n");


}
int main3()
{
char sss[1000];
while(gets(sss)){
int i,j;
char t;
qsort(sss,strlen(sss),sizeof(sss[0]),cmp);
// qsort(??????????????????????????С????????)??
for(i=0;i<strlen(sss);i++){
if(i==strlen(sss)){
printf("%c",sss[i]);
}
else{
printf("%c ",sss[i]);
}

}
printf("\n");

}

return 0;
}
int main2()
{
int n;
scanf("%d",&n);
int i,j;
int t=0;//t??? ???
for(i=0;i<n;i++){
for(j=0;j<n-i-1;j++){
printf(" ");
}
for(j=0;j<=i;j++){
printf("%c ",'A'+(t%26));
t++;
}
printf("\n");

}
return 0;
}

int main1()
{
int x,y,n;
int T;
int flag=0;
scanf("%d",&T);
while(T!=0){
T--;
scanf("%d",&n);
flag =0;
for(x=1;x<=100;x++){
for(y=x;y<=100;y++){
if(x*x*x+y*y*y==n){
flag =1;
printf("%d %d\n",x,y);
}
}
}
if(flag==0){
printf("No Solution\n");
}
}
return 0;
}

2048

铁定是垃圾网站的的问题才ac不了

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# include <stdio.h>
int main(){
int n;
scanf("%d",&n);
while(n--){
int i,j;
int a[4]={0};
int flag[4];
for(i=0;i<4;i++){
flag[i]=1;
}
for(i=0;i<4;i++){
scanf("%d",&a[i]);
}
for(i=3;i>=0;i--){
if(a[i]==0){
for(j=i;j>0;j--){
a[j]=a[j-1];

}
a[0]=0;
}
}
for(i=3;i>0;i--){
if(flag[i]==1&&a[i]==a[i-1]){
a[i] = a[i]*2;
a[i-1]=0;
flag[i-1]=0;
}
}

for(i=3;i>=0;i--){
if(a[i]==0||flag[i]==0){
for(j=i;j>0;j--){
a[j]=a[j-1];
}
a[0]=0;
}
}
printf("%d",a[0]);
for(i=1;i<4;i++){
printf(" %d",a[i]);
}
printf("\n");
}
}

走楼梯

kay小时候无聊的时候最喜欢爬楼梯了,当然他只喜欢向更高的楼梯爬。现在让你写一个程序,来判断他最多能爬多少步。假设起始点kay可以任意选择。并且显然kay只能选择上下左右进行爬。

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# include <stdio.h>
int a[1000][1000];
int min=1000;
int max=0;
int g_x,g_y;
int s_x,s_y;
int n,m;
int maxx(int c,int d){
if(c>d){
return c;
}
return d;
}
int main(){
while(scanf("%d %d",&n,&m)!=EOF){
int i,j;
int max=0;
g_x=0,g_y=0;
s_x=0,s_y=0;
for(i=0;i<n;i++){
for(j=0;j<m;j++){
scanf("%d",&a[i][j]);
if(min>a[i][j]){
min=a[i][j];
s_x=i;
s_y=j;
}
if(max<a[i][j]){
max=a[i][j];
g_x=i;
g_y=j;
}
}
}
//printf("%d\n",min);
// find max
int sum=0;
int max_sum=0;
for(i=0;i<n;i++){
for(j=0;j<m;j++){
sum=find_goal(i,j,a[i][j]);
if(sum>max_sum){
max_sum=sum;
}
}
}

printf("%d\n",max_sum);
}

}
int find_goal(x,y,now){// start to goal
// find_goal函数表示x,y坐标能找到的最大值
// x,y is the set now ,now is the set_value before
int step1,step2,step3,step4;
if(x>n||x<0||y>m||y<0||now>a[x][y]){ // now = before
return 0;
}
else{
now = a[x][y];
if(a[x-1][y]>now)
step1 = find_goal(x-1,y,now)+a[x-1][y]-now;
else
step1=0;
if(a[x+1]>now)
step2 = find_goal(x+1,y,now)+a[x+1][y]-now;
else
step2=0;
if(a[x][y-1]>now)
step3 = find_goal(x,y-1,now)+a[x][y-1]-now;
else
step3=0;
if(a[x][y+1]>now)
step4 = find_goal(x,y+1,now)+a[x][y+1]-now;
else{
step4=0;
}
int tt= maxx(step1,maxx(step2,maxx(step3,step4)));
//printf("%d ",tt);
return tt;
}

}

奇技淫巧

都是咱大一的时候玩剩下的

现在反倒是忘记了

输入输出

1
2
3
4
getchar();  // 获取不需要的字符,如换行,空格等
gets(ss); //获取一行
scanf();