多组输入问题(以C语言为例)
scanf函数原型int scanf( const char *format, … );
scanf()函数是格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。
其调用格式为: scanf(“<格式化字符串>”,<地址表>);
函数 scanf() 是从标准输入流 stdin 中读内容的通用子程序,可以读入全部固有类型的数据并自动转换成机内形式。
折叠scanf的返回值
scanf()函数返回成功赋值的数据项数,读到文件末尾出错时则返回EOF。(EOF 为-1)
多组处理
ACM多组数据处理到文件结尾, 这时如果用scanf();读入会返回EOF结束程序
int n, m;
while(scanf("%d%d", &n, &m) != EOF){
//code
}
while(cin >> n >> m){
}
这是一般写法
特殊写法:
int n;
while(~scanf("%d", &n)){
//code
}
这里遇到文件结尾, 返回EOF, 也就是-1, ~是单目取反运算符, 把操作数各位取反(0 -> 1 或是1 -> 0), 所以~-1 = 0, 退出
多组加条件控制
ex
程序有多组读入数据, 以0结束
处理思路:
在上面处理的基础上加上条件控制就可以
实现:
int n;
while(~scanf("%d", &n)){
if(n == 0)
break;
//code
}
或者用逗号运算符在读入的时候加限制
int n;
while(~scanf("%d", &n), n){
//code
}
给定组数
这个比较好理解
int T;
scanf("%d", &T);
while(T--){
//code
}
数组空间大小
如果需要开数组, 并且题目指出最大的容量为10000, 就把数组略开大, 防runtime error
const int maxn = 10000 + 5;
int a[maxn];
浅谈各种评判结果的最大可能bug
评判结果 | 问题 | 可能原因 |
---|---|---|
PE | 格式问题 | 一般是换行空格 |
TLE | 超时 | 复杂度太高或者数组开小或者数据类型小了 |
MLE | 超内存 | 开数组太大 |
OLE | 输出太多内容 | debug的输出没注释掉 |
WA | 答案错误 | 溢出或者算法问题 |
AC | 程序正确 | 或许数据水, 少, 反正过了 |