题目:Codeforces 105A
地址:http://codeforces.com/problemset/problem/105/A
要点:
获取浮点数的整数部分
double x
一般想法是int(x),但是实际上存在浮点误差
例如
(int)(8700*0.94) = 8177;
8700*0.94 = 8178;
原因是,在C语言中, 8700 * 0.94 = 8177.999999999999解决方案是当 x > 0, x = int(x+eps);当 x < 0, x = int(x- eps);其中eps <= 1e-6;
代码:
#include<string>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#define eps 1e-6
using namespace std;
struct allsk
{
string skill;
int level;
}ab[50];
bool check(allsk sk1[], string sk, int l)
{
int i;
for(i=0;i<l;i++)
if(sk1[i].skill==sk)
return 0;
return 1;
}
bool cmp(allsk a, allsk b)
{
return a.skill<=b.skill;
}
int main()
{
string sk;
int l;
int n, m, i, j, cnt;
double k;
cin>>n>>m>>k;
cnt = 0;
for(i=0;i<n;i++)
{
cin>>sk>>l;
l = (int)(l*k+eps);//消除浮点误差
if(l>=100)
{
ab[cnt].skill= sk;
ab[cnt++].level = l;
}
}
for(i=cnt;i<cnt+m;i++)
{
cin>>sk;
if(check(ab,sk,cnt))
{
ab[cnt].skill = sk;
ab[cnt++].level = 0;
}
}
sort(ab,ab+cnt,cmp);
cout<<cnt<<endl;
for(i=0;i<cnt;i++)
cout<<ab[i].skill<<" "<<ab[i].level<<endl;
}