码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 4329 MAP(stringstream的用法)

时间:2016-10-03 23:20:21      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:

  这个题目有点绕,但是按着他的意思写不难模拟出来。本来是一场学弟们的训练赛,我这个学长在赛场上却WA了四次都没过,三条黑线就一直在我的脑袋上挂着。。。

  赛后开始找原因,后来发现题目看错了,1/R中的R是指原先URL的个数。

  改过来发现还是过不了,想到了自己的输入处理可能是有问题的,既然自己模拟容易出错,那就使用了stringstream,自动提取单词,成功AC。

  意外的发现stringstream的功能十分强大,但是因为速度比较慢,用处比较少,所以也不怎么用,这个哥们写的不错,感兴趣可以去看看哦。

  具体注释在代码里~

#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<sstream>
using namespace std;
#define N 110
#define M 10005
int rel[N];
char a[M];
map<string,int>mp[N];
void Init(int k)
{
    istringstream str(a);///istringstream是一个类,str为它的一个对象
    ///这里使用构造函数接受一个字符串
    string tmp;
    int tot = 0;
    str >> tmp; ///提取一个单词,空格用于区分单词,不可能被提取到单词中
    ///其实如果自己模拟出错,应该就是把空格提到了单词中
    mp[k].clear();
    while(str >> tmp){///怎么样,是不是很短,很方便呢~
        tot++;
        mp[k][tmp] = 1;
    }
    rel[k] = tot;
}
double Get_AveP(int k)
{
    istringstream str(a);
    string tmp;
    int i = 0,R = 0;
    double res = 0;
    str >> tmp;
    while(str >> tmp){
        ++i;
        if(mp[k][tmp] == 1)
        {
            R++;
            res += R*1.0/i;
        }
    }
    return res/rel[k];
}
int main()
{
//    freopen("G.in.cpp","r",stdin);
    int t,n,ca=0;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        getchar();
        for(int i = 1; i <= n; i++)
        {
            gets(a);
            Init(i);
        }
        double MAP = 0.0;
        for(int i = 1; i <= n; i++)
        {
            gets(a);
            MAP += Get_AveP(i);
        }
        MAP /= n;
        printf("Case #%d: %.6lf\n",++ca,MAP);
    }
    return 0;
}

 

HDU 4329 MAP(stringstream的用法)

标签:

原文地址:http://www.cnblogs.com/jifahu/p/5929650.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!