入门总结"/>
个人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("%");
更多推荐
个人ACM入门总结
发布评论