该死的水题

// 来自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;
}
View Code

    代码最后用全使用了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;
}
View Code

 

 

另一水题 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;
}
View Code

 

    全是我的锅呀。。。简简单单的水题我怎么写了这么多bug T_T

    还得好好多刷题呀。

 

posted @ 2018-09-11 00:42  izcat  阅读(262)  评论(0编辑  收藏  举报