首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 其他相关 >

Problem - 105A - Codeforces A.(精度有关问题)

2013-11-09 
Problem - 105A - Codeforces A.(精度问题)链接:http://codeforces.com/problemset/problem/105/A?解题思

Problem - 105A - Codeforces A.(精度问题)

链接:http://codeforces.com/problemset/problem/105/A

?

解题思路:题目要求输出单词必须按字典序输出,用STL中的map容器会比较简单

map容器实质上是一个二叉查找树,它可以做插入、查找、查询等操作。时间复杂度log(n);

n为map中元素的个数,再用迭代器去访问map中的元素就是按照字典序进行访问的

?

map<x1,x2>it1;

x1为键,x2为值,键是用来索引的,值就是其存储的信息

?

此题应注意的是精度问题

例如:

1 1 0.3

aaa 1000

b

输出为:

aaa 299

b 0

说明double存储数据的时候可能不是300.000....而是299.999999...

故类型转换的时候先加0.0001(0.001到0.000001都行)

?

#include<cstdio>#include<cstring>#include<iostream>#include<map>#include<string>using namespace std;map<string,int>::iterator it;map<string,int>val;int n,m;int exp;double k;char str[100];int main(){while(scanf("%d %d %lf", &n, &m, &k) != EOF){int cnt = 0;for(int i = 0; i < n; i++){scanf("%s",str);getchar();scanf("%d",&exp);//printf("k = %lf,exp = %d\n",k,exp);//printf("%lf\n",k*exp);exp = int(exp *1.0 * k + 0.0001);//printf("exp = %d\n", exp);if( exp < 100 ) continue; val[str] = exp;cnt++;}for(int i = 0; i < m; i++){scanf("%s",str);if(val[str] != 0) continue ;else {val[str] = 0;cnt++;}}printf("%d\n",cnt);for( it = val.begin(); it != val.end(); it++ ){cout<< it -> first <<" "<< it -> second << endl ;//printf("%s %d",it->first,it->second);}val.clear();//注释1}return 0;} 

?注释1:竟然是有没有都可以,但是很明显的

5 4 0.75

a 300

b 250

c 200

d 150?

e 100

e

d

c

b

4 4 0.75

e 300

d 250

c 200

b 150

b

c

d

e

输出就会有问题,当初还以为这错了!改了好久Problem - 105A - Codeforces A.(精度有关问题)

?

热点排行