输入优化(输入外挂)

  有时候用输入挂并不只是为了效率,对于一些以行末为结束(即 ‘\n‘ 或 ‘\r‘)的若干个数据的读入,此时用输入挂来处理就显得很有必要了,以判断字符是否为 ‘\n‘ 或 ‘\r‘ 来结束输入,否则单用 scanf 的话无法达到上述效果。

1. 先来一个单纯用于正数读入,并且题目已明确给出输入的整数的个数(即不用手动判断何时为输入结束)的输入挂:

 1 #include<cctype>
 2 template<typename T>
 3 inline void read(T &x) {
 4     x = 0;
 5     char ch = getchar();
 6     while(!isdigit(ch))    ch = getchar();
 7     while(isdigit(ch)) {
 8         x = x * 10 + (ch - ‘0‘);
 9         ch = getchar();
10     }
11 }

  感觉挺精简的。

2. 然后是可以支持负数读入的输入挂:

 1 #include<cctype>
 2 template<typename T>
 3 inline void read2(T &x) {
 4     x = 0;
 5     bool nag = 0;
 6     char ch = getchar();
 7     while(!isdigit(ch) && ch != ‘-‘)    ch = getchar();
 8     if(ch == ‘-‘) {
 9         nag = 1;
10         ch = getchar();
11     }
12     while(isdigit(ch)) {
13         x = x * 10 + (ch - ‘0‘);
14         ch = getchar();
15     }
16     if(nag)   x = -x;
17 }

  在前面的基础上加了一个符号的标记信息而已。

3. 接下来是支持负数读入和行末结束判断的输入挂,并且负数读入时符号和数字之间允许有空格:

 1 inline bool isline(const char &ch) {
 2     return ch == ‘\n‘ || ch == ‘\r‘;
 3 }
 4
 5 #include<cctype>
 6 bool eol;
 7 template<typename T>
 8 inline void read3(T &x) {
 9     x = 0;
10     bool nag = 0;
11     eol = 0;
12     char ch = getchar();
13     while(!isdigit(ch) && ch != ‘-‘)    ch = getchar();
14     if(ch == ‘-‘) {
15         nag = 1;
16         while(!isdigit(ch))    ch = getchar();
17     }
18     while(isdigit(ch)) {
19         x = x * 10 + (ch - ‘0‘);
20         ch = getchar();
21     }
22     if(nag == 1)   x = -x;
23     if(isline(ch))    eol = 1;
24 }

  比起第二个版本,增加了一个全局变量 eol (end of line) 来表示是否读入了换行符 ‘\n‘ 或 ‘\r‘,因为在主函数中要用这个来判断,所以就定义成了全局变量,如果用函数的返回值来作为换行符的判断的话,那最后一个读入的数据恐怕要另作处理了,感觉并不比这种方法方便,所以便使用全局变量了,并在每次读入时初始化 eol 为 0,在主函数中也有可能需要重置为 0,或许我这样的设计并不是最好的,但一般OJ上的题目也不会太卡输入格式(应该没有那么变态的题吧),感觉也够用了。

  初步测试过没问题,有些细节可适当增删。

时间: 2024-10-15 21:45:34

输入优化(输入外挂)的相关文章

【HDU 5811】Colosseo(拓扑+输入优化)

[HDU 5811]Colosseo(拓扑+输入优化) Colosseo Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 446    Accepted Submission(s): 98 Problem Description Mr. Chopsticks keeps N monsters, numbered from 1 to N.

Swift社交应用文本输入优化汇总

一.输入相关的优化问题 在大部分应用中,都有输入的需求,面对众多用户,他们的想法各异,输入的文本内容也是千奇百怪,面对不同的输入,我们该如何优化输入体验?这里集中汇总输入相关问题,主要如下: 1.输入控件UITextField跟随键盘移动 2.过滤输入内容 3.响应编程的处理,去除体验不好的对话框.HUD提示 4.中文输入 二.输入框随键盘移动 界面构建有两种方法,代码或者storyboard/xib,这两种方法在处理键盘移动上方法相同,这里推荐使用已经封装好的第三方框架:TPKeyboardA

HDU - 6178:Monkeys (贪心&amp;树上最大匹配输&amp;输入优化)

There is a tree having N vertices. In the tree there are K monkeys (K <= N). A vertex can be occupied by at most one monkey. They want to remove some edges and leave minimum edges, but each monkey must be connected to at least one other monkey throug

Java输入、输入、IO流 类层次关系梳理

Java输入.输入.IO流 类层次关系梳理 本文主要关注在Java编程中涉及到的IO相关的类库.方法.以及对各个层次(抽线.接口继承)的流之间的关系进行梳理 相关学习资料 http://baike.baidu.com/view/1007958.htm?noadapt=1 http://blog.csdn.net/hguisu/article/details/7418161 https://www.ibm.com/developerworks/cn/java/j-lo-javaio/ http:/

[Android新手区] android里面EditTex多行输入及输入置顶问题

在麦子学院android交流群里面有人问edittex多行输入及输入置顶的问题,其实这个效果很好的实现的,现在跟说说: 在EditText里面添加android:minLines="3"即可,但是现实效果如下: 如果想要使输入从顶部开始,可以在xml文件里面添加一句 android:gravity="Top"即可.效果如下:

c++输入优化

刚学c++的时候总是在cin或cout上TLE,于是发誓不再用cin.但是cin真的比scanf好看很多,于是百度一下发现这样可以优化cin 只要加上这一句话,就能取消cin与std间的同步性 std::ios::sync_with_stdio(false); 或者读入一个字符串再操作 void fread_analyse() { freopen("data.txt","rb",stdin); int len = fread(buf,1,MAXS,stdin); b

限制输入,输入金额 和保留小数点后两位

//判断是否是浮点类型 + (BOOL)isPureFloat:(NSString*)string { NSScanner* scan = [NSScanner scannerWithString:string]; float val; return [scan scanFloat:&val] && [scan isAtEnd];} //在textFiled中限制输入位数 if ([string isEqualToString:@""]) { return YE

Linux下Qt5.6 Fcitx无法输入中文输入解决办法

Qt5.6的解决办法和之前的版本有点不同,方法如下:首先安装 fcitx-frontend-qt5.然后执行: 123 sudo cp /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitxplatforminputcontextplugin.so /opt/Qt5.6.0/Tools/QtCreator/lib/Qt/plugins/platforminputcontexts/ sudo cp /usr/lib/

P1424 小鱼的航程(改进版) 有一只小鱼,它上午游泳150公里,下午游泳100公里,晚上和周末都休息(实行双休日),假设从周x(1&lt;=x&lt;=7)开始算起,请问这样过了n天以后,小鱼一共累计游泳了多少公里呢? 输入输出格式 输入格式: 输入两个整数x,n(表示从周x算起,经过n天,n在long int范围内)。 输出格式: 输出一个整数,表示小鱼累计游泳了多少公里。

#include <stdio.h> #include <stdlib.h> int main() { long int n, i, week, distance; scanf("%ld %ld", &week, &n); distance = 0; for (i=0; i<n; i++) //n次循环 { if (week == 6) //若为周六week+1,同时天数i+1 { week++; i++; } if(week ==7 )