整理旧文:论学灰是如何写代码的

写在前面

去年年初在阿里云ACE上写的几篇博客,通过找到存档的.sql文件找回几篇文字。陆续整理一下吧。

  • [ ] 在宿舍窗台,能看到院子外那块大草坪的边角有两株树,一株是樱树,还有一株也是樱树
  • [ ] What Can I Hold You With?
  • [ ] 我能吞下身体而不伤身体..233
  • [ ] 一个月前写给别人的生日信笺里的一小段话…
  • [ ] 夏虫如何才能语冰…
  • [x] 论学灰是如何写代码的

论学灰是如何写代码的

1
2
3
4
5
'2015-04-20 13:24:25',
'143',
'http://h.since2014.cn/archives/144',
'0',
'revision'

忙于各种事情,却无一事能善始终。拖到今晚才开始写ACM,不知道是否还像上次那样自己作贱。写ACM写了将近一晚上,奈何实在愚笨,算法各种混乱,写出来的程序、输出出来的值一滩浆糊,结构上看似还好,实际运算逻辑自己都没理顺。窟窿越补越多,完全没有一个做ACM的心态和方法,白白浪费时间。代码越堆越多,又不想推倒重来理清思路,到后来完全是徒劳无功的胡乱调试。明明有更好的方法的,我这样疏于动脑,只知一味消磨时间,除了耗费掉自己本就不多的积极性还有什么补益么?然后又是什么半途而废一事无成的老样子?

1
2
3
<fieldset style="border: none; border-top: 1px solid #B1B1B1;">
<legend style="font-size: 12px;" align="CENTER">学灰的代码存档</legend>
</fieldset>

学灰的代码存档

In theory, theory and practice are the same….mostly.

论学灰是如何写代码的

顺序做题法

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
//顺序做题法
#include <stdio.h>
int putin[50][10000]={{0}};
int main(void){
int i=0,j=0,n=0,k=0,p=0;
int mun[50][2]={{0}};
int and_1=0;
int count[50]={0};
scanf("%d",&n);
do{
scanf("%d",&mun[i][j]);
scanf("%d",&mun[i][j+1]);
for(k=0;k<mun[i][j];k++){
scanf("%d",&putin[i][k]);
}
i++;
}while(i<n);
//取巧的加法 来做末尾判断 然而并没有什么卵用;麻烦;
// for(i=0;i<n;i++){
// putin[i][mun[i][0]]=100000;
// }
//count[i],and_1
for(i=0;i<n;i++){
and_1=0;
for(j=0;j<mun[i][0];j++){
and_1+=putin[i][j];
if(and_1==mun[i][1]){
count[i]++;
and_1=0;
}
//butong?
if(and_1>mun[i][1]){
count[i]++;
and_1=putin[i][j];
}
}
//加分计数大成功?~ //尾数啊啊啊啊!
if(and_1>0) count[i]++;
}
for(i=0;i<n;i++)
printf("%d\\n",count[i]);
return 0;
}

尤是要注意一些优先级的问题

小兔子跳台阶

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
//问题 V: 小兔子跳台阶
#include "stdio.h"
#include "stdlib.h"
int count[20]= {0};
void fuck() {
for(int i=0; i<20; i++) count[i]=1;
}
long choise2(long n,long i);
long choise1(long n,long i);
long choise1(long n,long i) {
if(n==1) count[i]=1;
if(n==2) count[i]=2;
n--;
if(n>2) {
choise1(n,i);
choise2(n,i);
}
if(n==1) {
count[i]++;
}
if(n==2) {
count[i]+=2;
}
return 0;
}
long choise2(long n,long i) {
if(n==1) count[i]=1;
if(n==2) count[i]=2;
n-=2;
if(n>2) {
choise1(n,i);
choise2(n,i);
}
if(n==1) {
count[i]++;
}
if(n==2) {
count[i]+=2;
}
return 0;
}
int main() {
long m,mun[20];
//fuck();
scanf("%d",&m);
for(int i=0; i<m; i++) {
scanf("%d",&mun[i]);
choise1(mun[i],i);
choise2(mun[i],i);
}
for(int i=0; i<m; i++) {
printf("%d\\n",count[i]);
}
return 0;
}

问题 I: 棋盘覆盖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//问题 I: 棋盘覆盖 简化的... 果然快..
#include "stdio.h"
int main() {
int tab[42]= {1,2,3,5,8,13};
int n[10];
int t,i;
scanf("%d",&t);
for(i=0; i<t; i++) scanf("%d",&n[i]);
for(i=6; i<42; i++){
tab[i]=tab[i-1]+tab[i-2];
}
for(i=0;i<t;i++){
printf("%d\\n",tab[n[i]-1]);
}
return 0;
}