简而言之
doubel num=363,实际上double可能存的是362.999999,然后int num1=num,num1就是362。
怎么避免呢?
int num1 = round(num);//round是四舍五入
//这样就可以了
没什么难度。
AC代码
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
const int N = 1e4 + 1;
struct node
{
double money = 0;
int bh = 0;
long long hb = 0;
};
int n, k, a;
double q[N], b;
long long hb[N];
vector<node>num;
bool cmp(node x, node y)
{
int num1 = round(x.money * 100), num2 = round(y.money * 100);
if (num1 == num2 && x.hb == y.hb)return x.bh < y.bh;
if (num1 == num2)return x.hb > y.hb;
return num1 > num2;
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
{
scanf("%d", &k);
while (k--)
{
scanf("%d%lf", &a, &b);
b /= 100;
q[i] -= b;
q[a] += b;
++hb[a];
}
}
for (int i = 1; i <= n; ++i) num.push_back(node{ q[i],i,hb[i] });
sort(num.begin(), num.end(), cmp);
for (int i = 0; i < n - 1; ++i)printf("%d %.2lf\n", num[i].bh, num[i].money);
printf("%d %.2lf", num[n - 1].bh, num[n - 1].money);
return 0;
}