这个题目有点绕,但是按着他的意思写不难模拟出来。本来是一场学弟们的训练赛,我这个学长在赛场上却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; }
时间: 2024-10-21 21:06:15