个人ACM入门总结

萌新入门备忘录,随时更新/纠错

输出

printf:
输出指定长度(N)的字符串, 超长时截断(限制大小M), 不足时右对齐(空格填充):   

 printf("%N.Ms", str);       

改为左对齐:    printf("%-N.Ms", str);     
N,M可以动态指定,用*代替M或者N,然后在参数列表里加上一个数字参数。
例子:printf("%-*.*s", 5,2,"123");

cout:

库 < iomanip > 包含了对输入输出的控制。

cout << fixed << setprecision(3) << i << endl;//控制小数点后精度

输入

速度:

(大约时间) cin = getline(cin) > scanf > getchar > fgets

用scanf读入string:

s.resize(n);
scanf("%s",s);

此时s大小必为n,不足会自动填充。

返回值:

fgets(s,MAX,stdio);会读取并保存换行符,结束时返回空指针(0)

>>操作重载函数遇到EOF返回0

scanf返回值为输入字符数,文件结尾返回EOF

竞赛相关

对于cin和cout

关同步流:std::ios::sync_with_stdio(false);

解除绑定:cin.tie(0),cout.tie(0);

注意,关闭同步后,不能再使用scanf, printf

  • 同步导致的效率问题,一些输入量大的题目会超时
  • 代码手动关闭同步,可能导致输出顺序错误
  • 数据本身特殊情况或编码问题导致的玄学问题

尽量不使用cin和cout,统一使用 stdio

对于样例

观察输入组数,是否含特殊情况(0,重复样例,生成闭环等

输出时注意格式,不一定完全与sample一致,看题目的要求

 尽量不用 using namespace std,防止命名混乱

使用函数、STL等时刻注意特殊性质,谨防乱用导致出错

拿到题目第一步是理解(准确理解!)题意,不能盲目开始写题

利用 tolower() 函数的返回值改变字符串,其本身不改变字符串

常数优化

位操作具备更快的运算速度
x=x*2;           x<<=1;
y=y/2;           y>>=1;
if(x%2==1);      if(x&1) ;
x=pow(2,n);      x=(1<<n);


std::vector<bool>的效率会很慢 (考虑用std::bitset)


对非递归且代码块短的函数,声明为内联(inline)
int cmp(int a,int b) {return a<b;}
改为
inline int cmp(int a,int b) {return a<b;}


每次调用函数时都会重新创建它的形参,并用传入的实参对形参进行初始化
(实参被值传递时相当于创建实参的拷贝),拷贝大的类类型对象或者容器对象比较低效
(比如vector,或者一个很长的string),如果函数无须改变形参的值,最好将其声明为常量引用。
inline int cmp(string a,string b) {return a<b;}
//改为
inline int cmp(const string &a,const string &b) {return a<b;}


if条件语句比min和三元运算符快


由集训队大佬总结while(1) printf("%");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值