[关闭]
@cww97 2017-12-30T11:01:31.000000Z 字数 3086 阅读 953

NOIP2018: 一、编程习惯和代码风格

NOIP


1. typedef long long LL;

2. 常量定义

  1. const int N = 1e5 + 7;
  2. const double EPS = 1e-6;
  3. const int INF = 0x3f3f3f3f; // LL 0x3f3f3f3f3f3f3f3f

3. return 0;

4. scanf, printf

%d 读入十进制整数
%x 读入十六进制整数 %X为大写十六进制
%c 读入一个字符
%s 读入一个字符串
%f 读入一个浮点数
%p 读入一个指针
%u 读入一个无符号十进制整数
%lld linux系统LL(%I64d windows系统LL,具体情况看oj)
%llu unsigned long long

scanf一个double数据,是%lfprintf一个float或者double都是%f
大写L,加f输出long double。最后的f小写和大写没影响,但是第一个 l 必须大写成L

printf 对齐方式

5. 文件操作

  1. freopen("in.txt", "r", stdin);
  2. freopen("out.txt", "w", stdout);

把题目样例敲进in.txt可以有效提高debug效率,建议加多组数据

  1. for (; ~scanf("%d", &n);){
  2. // work on problem
  3. }

这样自己造数据测的时候可以节省更多时间

6. 善用struct

hdu5912

  1. #include <iostream>
  2. #include <cstdio>
  3. using namespace std;
  4. typedef long long LL;
  5. LL gcd (LL a,LL b){
  6. return (b==0)?a:gcd(b,a%b);
  7. }
  8. struct fenshu{
  9. LL fz,fm;
  10. fenshu (){fz = 0;fm = 1;}
  11. fenshu (LL x,LL y):fz(x),fm(y){}
  12. fenshu operator + (const fenshu &a)const{
  13. LL FM = fm*a.fm/gcd(fm,a.fm) ;
  14. LL FZ = fz*FM/fm+a.fz*FM/a.fm;
  15. return fenshu{FZ,FM};
  16. }
  17. fenshu operator / (const fenshu &a)const{
  18. LL FZ = fz*a.fm;
  19. LL FM = fm*a.fz;
  20. LL gc = gcd(FZ,FM);
  21. return fenshu{FZ/gc,FM/gc};
  22. }
  23. }a[11],b[11];
  24. int main(){
  25. //freopen("in.txt","r",stdin);
  26. LL T; scanf("%I64d",&T);
  27. for (LL n,cas=1;cas<=T;cas++){
  28. scanf("%I64d",&n);
  29. for (LL i=1;i<=n;i++) a[i].fz=1 ,b[i].fz=1;
  30. for (LL i=1;i<=n;i++) scanf("%I64d",&a[i].fz);
  31. for (LL i=1;i<=n;i++) scanf("%I64d",&b[i].fz);
  32. fenshu ans = fenshu(0,1);
  33. for (LL i=n;i>=1;i--){
  34. ans = b[i]/(ans + a[i]);
  35. }
  36. printf("Case #%I64d: %I64d %I64d\n",cas,ans.fz,ans.fm);
  37. }
  38. return 0;
  39. }

这里给一个简单的例子
矩阵,数据结构,图,之类的,后面会struct会越来越大

7. 函数式编程

比如你需要把if(ch>='a' && ch<='z') 拆成一个函数叫is_alpha()

一个函数(包括int main)尽量不要超过20行,一定不要超过30行,

超过了的话不加分割线人一眼看上去是很难受的,感觉一坨坨的

刚刚想到一个,少用全局变量

写代码的顺序,写完int main(), 再往上写int main里面用到的函数

然后函数里面调用了某个函数等这个函数写完了再补,这么写思路很连贯

一气呵成,然后debug的时候还可以模快测试

hohicoder 1362

  1. #include<cstdio>
  2. #include<iostream>
  3. using namespace std;
  4. const int INF=0x3f3f3f3f;
  5. const int N=1e5+100;
  6. int n,m,len,a[N],b[N];
  7. bool repair(int start,int h){
  8. int cnt = 0;
  9. for (int i=start;i<=start+n;i++)
  10. if (b[i]<h){i+=len-1;cnt++;}
  11. return cnt <= m;
  12. }
  13. bool check(int h){
  14. for (int i=1;i<=n+len;i++)b[i]=a[i];
  15. for (int i=1;i<=len;i++)
  16. if (repair(i,h))return 1;
  17. return 0;
  18. }
  19. int main(){
  20. freopen("fuck.in","r",stdin);
  21. scanf("%d%d%d",&n,&m,&len);
  22. for (int i=1;i<=n;i++){scanf("%d",&a[i]);}
  23. for (int i=n+1;i<=n+len;i++)a[i]=a[i-n];
  24. int L=0,R=INF,ans;
  25. for (;L<=R;){
  26. int mid=(L+R)>>1;
  27. if (check(mid)){L=mid+1;ans = mid;}
  28. else R = mid-1;
  29. }
  30. printf("%d\n",ans);
  31. return 0;
  32. }

更极端的栗子:工程代码

8. 变量命名

hdu6186

求三种sum丢掉第k位
预处理出所有的前缀和后缀

  1. #include <cstdio>
  2. #include <iostream>
  3. using namespace std;
  4. const int N = 1e5 + 7;
  5. int arr[N];
  6. int prXor[N], prAnd[N], preOr[N];
  7. int suXor[N], suAnd[N], sufOr[N];
  8. int main(){
  9. //freopen("in.txt", "r", stdin);
  10. int n, q;
  11. for (; ~scanf("%d%d", &n, &q);){
  12. prXor[0] = suXor[n+1] = 0;
  13. prAnd[0] = suAnd[n+1] = ~0;
  14. preOr[0] = sufOr[n+1] = 0;
  15. //printf("%d\n", prAnd[0]);
  16. for (int i = 1; i <= n; i++){
  17. scanf("%d", &arr[i]);
  18. prXor[i] = prXor[i-1] ^ arr[i];
  19. prAnd[i] = prAnd[i-1] & arr[i];
  20. preOr[i] = preOr[i-1] | arr[i];
  21. }
  22. for (int i = n; i >= 1; i--){
  23. suXor[i] = suXor[i+1] ^ arr[i];
  24. suAnd[i] = suAnd[i+1] & arr[i];
  25. sufOr[i] = sufOr[i+1] | arr[i];
  26. }
  27. for (int k; q--;){
  28. scanf("%d", &k);
  29. int ansXor = prXor[k-1] ^ suXor[k+1];
  30. int ansAnd = prAnd[k-1] & suAnd[k+1];
  31. int ansOrr = preOr[k-1] | sufOr[k+1];
  32. printf("%d %d %d\n", ansAnd, ansOrr, ansXor);
  33. }
  34. }
  35. return 0;
  36. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注