该死的水题
// 来自ICPC 2018 徐州赛区网络预赛的两道水题
// 其中一题艰难debug终于AC,另一题疯狂WA直到结束
// 在今天队友学习了map的操作后,总结此番教训......
开场水题 Characters with Hash
英语原题不难理解,结合样例也能弄明白,就是按照要求将字符串转化为一串整数后,求得到没有前导零的整数的位数。很显然,开始前面的一串0是不记录长度的,那么就从前往后一直找到非0开始的数字,到末尾的长度为n-i。首位数字是一位,结果即为(n-i)*2-1;首位数字为两位,结果则为(n-i)*2。
坑:转化得到的数字为0,输出为1!!!数字0的位数为1啊!!!
// 感谢Wu两小时坚持不懈的毅力和惊人的洞察能力Orz
AC代码:
#include <cstdio> #include <cmath> #include <iostream> #include <string> using namespace std; string str; int main() { int T, n; scanf("%d", &T); char L; while(T--) { cin>>n;cin>>L; cin>>str; int i=0; while(abs((int)L-str[i])==0) i++; if(i==n) printf("1\n"); else if(abs(L-str[i])<10) printf("%d\n", (n-i)*2-1); else printf("%d\n", (n-i)*2); } return 0; }
代码最后用全使用了cin读入,这是因为不太清楚读取%d %c后接着读取%s是否会有回车符影响下次读取。
经测试,无论加了注释的getchar();语句与否,都不影响结果正确性,如下:
#include <cstdio> #include <iostream> #include <cmath> using namespace std; char str[1000100]; int main() { int T, n; scanf("%d", &T); char L; while(T--) { scanf("%d %c", &n, &L); // getchar(); scanf("%s", str); int i=0; while(abs(L-str[i])==0) i++; if(i==n) printf("1\n"); else if(abs(L-str[i])<10) printf("%d\n", (n-i)*2-1); else printf("%d\n", (n-i)*2); } return 0; }
另一水题 Features Track
这应该也是简单的模拟题。
经Wu讲解题意后,我用map以及vector迅速实现了代码,一发两发都WA,我也意识到了题目可能的坑:单个feature可能在同一帧中重复出现,只需要记录一次。可惜处理不当一时陷入僵局。。。
今天得到Yu的指点终于明白,一行代码的错!!!
#include <cstdio> #include <algorithm> #include <iostream> #include <map> #include<string> #include <vector> using namespace std; typedef long long ll; typedef pair<string, string> P; map<P, int> No; int cnt = 0; vector<vector<int> > vec(100010); int getID(P p) { if(No[p]) return No[p]; else return No[p] = ++cnt; } int main() { int T; scanf("%d", &T); while(T--) { int n, k; string a, b; scanf("%d", &n); cnt = 0; for(int i=1;i<=n;i++) { scanf("%d", &k); while(k--) { cin>>a>>b; int no = getID(P(a, b)); if(vec[no].size()==0 || vec[no][vec[no].size()-1]!=i) // 该行size()为0要特判一下。。。因为运行错误导致我另寻他路偏离了轨道 vec[no].push_back(i); } } int now = 1, maxx = 1; for(int i=1;i<=cnt;i++) { now = 1; for(int j=1;j<vec[i].size();j++) { if(vec[i][j]==vec[i][j-1]+1) now++; else now = 1; if(maxx<now) maxx = now; } } if(!cnt) maxx = 0; printf("%d\n", maxx); for(int i=1;i<=cnt;i++) vec[i].clear(); No.clear(); } return 0; }
全是我的锅呀。。。简简单单的水题我怎么写了这么多bug T_T
还得好好多刷题呀。