1.字符统计:一串字符统计其字符数量,不含空格换行。
注意EOF的使用(怕不是因为OJ,我现在可能都不知道EOF是什么鬼),以及getchar()的特性。
```
1 #include <stdio.h> 2 3 int main() 4 { 5 int num; 6 char c; 7 8 while (1) { 9 c = getchar(); 10 if (c == EOF) break; 11 if (c != ' ' && c != '\n') 12 num++; 13 } 14 printf("%d\n", num); 15 16 return 0; 17 18 }
```
2.字符串比较大小
这个函数接受两个字符串 s1,s2。这些字符串只能由小写字母组成,并且具有相同的长度。这个函数的输出是另一个长度与 s1,s2 相同的字符串 g。g 的第 i 个字符等于 s1 的第i 个字符和 s2 的第 i 个字符的最小值,简单来说,g[i]=min(s1[i],s2[i])。(详见洛谷)
注意在字符串的题目中,末尾记得加‘\0’否则……
```
1 #include <stdio.h> 2 int main() 3 { 4 char s1[103],s2[103],g[103]; 5 int len=0,i=0; 6 scanf("%d",&len); 7 8 scanf("%s",s1); 9 scanf("%s",s2); 10 11 for(i=0;i<len;i++) 12 { 13 if(s1[i]>s2[i]) 14 { 15 g[i]=s2[i]; 16 17 } 18 if(s1[i]<s2[i]) 19 { 20 break; 21 } 22 if(s1[i]==s2[i]) 23 { 24 g[i]='z'; 25 } 26 } 27 if(i==len) 28 { 29 g[i]='\0'; 30 printf("%s",g); 31 } 32 else 33 printf("-1"); 34 return 0; 35 }
```
3.阶梯计费及四舍五入
月用电量在150千瓦时及以下部分按每千瓦时0.4463元执行,月用电量在151~400千瓦时的部分按每千瓦时0.4663元执行,月用电量在401千瓦时及以上部分按每千瓦时0.5663元执行;想自己验证一下,电费通知单上应交电费的数目到底是否正确呢。请编写一个程序,已知用电总计,根据电价规定,计算出应交的电费应该是多少。
输入格式:
输入一个整数,表示用电总计(单位以千瓦时计),不超过10000。
输出格式:
输出一个数,保留到小数点后1位(单位以元计,保留到小数点后1位)
这道题做出大框架非常简单,但似乎四舍五入时出了一点问题,在没有做到这题以前,好像老师上课有教过怎么四舍五入,可惜没印象了,毕竟是老师单方面灌输的,事实上就是我只记得自己学的内容,考试也是凭着自己学的那点东西水过去的。
```
#include<stdio.h> #define A 0.4463 #define B 0.4663 #define C 0.5663 int main() { double total=0,p1=0,p2=0,p3=0; int used=0; scanf("%d",&used); if(used>=401) { p1=150; p2=250; p3=used-p1-p2; } else if(used>=151) { p1=150; p2=used-p1; } else if(used>0) { p1=used; } total=p1*A+p2*B+p3*C; total=int((total*10)+0.5)/10.0; printf("%.1lf",total); return 0; } ``` 不要问我怎么想起来要四舍五入的,因为我现在遇到OJ的题目基本上一遍过不了,试了几次就看题解,在题解里惊讶地发现,我去,还要四舍五入,我就直接%.1f了 下面划重点,如何四舍五入!!!(我是真的鶸鶸) ``` total=int((total*10)+0.5)/10.0;
```
4.超时问题
我还是第一次遇到TLE。
这一题也是上手很快,拿着草稿纸就写下了源码,结果敲到IDE里的时候,输入了样例,回车,光标静静地闪动,我又换了一个IDE,依然如此。我感觉是IDE有病,就直接提交到OJ,显示8个TLE,2个AC。。。
**这是时间复杂度贼高,算法水平无比落后的最初的想法orz。**
``` #include<stdio.h> int main() { int M = 0, N = 0, box = 0, beg; int num[10], bit = 0, temp = 0; scanf("%d%d", &M, &N); for (int i = 0; i < 10; i++) { num[i] = 0; } for (beg = M; beg <= N; beg++) { if (beg < 10) { num[beg]++; } else { box = beg; while (beg > 0) { beg = beg / 10; bit++; } for (int i = 0; i <= bit; i++) { temp = box % 10; num[temp]++; box = box / 10; } } } printf("%d %d %d %d %d %d %d %d %d %d\n", num[0], num[1], num[2], num[3], num[4], num[5], num[6], num[7], num[8], num[9]); return 0;
```
关键是看起来好像自己还挺会使用for循环的样子结果输出却不知道要用循环,直接来一段暴力%d%d%d%d%d%d%d%d%d%d,醉了
下面是AC代码
```
int main() { int M=0,N=0,box=0,beg; int num[10]; scanf("%d%d",&M,&N); memset(num,0,sizeof(num));//参考洛谷题解orz学到了 for(beg=M;beg<=N;beg++) { box=beg; while(box>0) { int x=box%10; num[x]++; box=box/10; } } printf("%d %d %d %d %d %d %d %d %d %d\n",num[0],num[1],num[2],num[3],num[4],num[5],num[6],num[7],num[8],num[9]); return 0; }
```
再画个重点,数组一定要记得初始化,不然没有没有被赋值就是奇奇怪怪的数字了hhh
简单又装b的初始化数组技巧,感谢洛谷大佬..、
.` memset(num,0,sizeof(num));`
5.
题目描述1-洛谷
经历千辛万苦,他收集了连续N(1<=N<=10^7)天的最高气温数据。
现在,他想知道最高气温一直上升的最长连续天数。
输入输出格式
输入格式:
*1行:一个整数N。1<=N<=10^7
*2行:N个空格隔开的整数,表示连续N天的最高气温。0<=最高气温<=10^9。
输出格式:
*1行:一个整数,表示最高气温一直上升的最长连续天数。
第一遍,1AC其他TLE
超高校级的时间复杂度加数组哭泣
#include <stdio.h> int main() { long long i, days, cnt=1,weather[10000000],box[10000000]; for (i = 0; i < days; i++) { box[i] = 0; scanf_s("%lld", &weather[i]); } for (i = 0; i < days-1; i++) { if (weather[i] < weather[i + 1]) cnt++; else { box[i] = cnt; cnt = 1; } } cnt = box[0]; for (i = 1; i < days; i++) { if (box[i] > cnt) { cnt = box[i]; } } printf("%lld", cnt); return 0; }
第二个AC代码
1 #include <stdio.h> 2 int main() 3 { 4 long long i, days, temp,first, cnt = 1,max=0; 5 scanf_s("%lld", &days); 6 scanf_s("%lld", &first); 7 for (i = 2; i <=days; i++) 8 { 9 scanf_s("%lld",&temp); 10 if (temp>first) 11 { 12 cnt++; 13 if (cnt > max)//我感觉这里的if用了两次,可以省略的 14 max = cnt; 15 } 16 else 17 { 18 if (cnt > max)//这样重复使用真的好丑233333 19 max = cnt; 20 cnt = 1; 21 } 22 first = temp; 23 } 24 printf("%lld", max); 25 return 0; 26 }