UVa_Live 3664(精度坑)

题意很好理解的贪心题,然而却卡疯了的精度坑。

再次理解一下double小数运算时可能导致的精度问题,本题为避免该问题可以将小数乘以100化为整数进行比较,输出的时候再除以100就ok;

思路也很好想,数据也不大,直接贴代码吧。

  1 #include <cstdio>
  2 #include <iostream>
  3 #include <sstream>
  4 #include <cmath>
  5 #include <cstring>
  6 #include <cstdlib>
  7 #include <string>
  8 #include <vector>
  9 #include <map>
 10 #include <set>
 11 #include <queue>
 12 #include <stack>
 13 #include <algorithm>
 14 using namespace std;
 15 #define ll long long
 16 #define _cle(m, a) memset(m, a, sizeof(m))
 17 #define repu(i, a, b) for(int i = a; i < b; i++)
 18 #define repd(i, a, b) for(int i = b; i >= a; i--)
 19 #define sfi(n) scanf("%d", &n)
 20 #define pfi(n) printf("%d\n", n)
 21 #define MAXN 100010
 22 const int maxn = 16400;
 23 struct Player
 24 {
 25     double a, b, c;
 26     int max_;
 27     set<int> s;
 28 } p[maxn];
 29 int r[maxn], vis[maxn];
 30 int main()
 31 {
 32     int n;
 33     int T = 1;
 34     while(~scanf("%d", &n) && n)
 35     {
 36         for(int i = 0; i <= n; i++)
 37             p[i].s.clear();
 38         for(int i = 1; i <= n; i++)
 39         {
 40             scanf("%lf%lf%lf", &p[i].a, &p[i].b, &p[i].c);
 41             int a = (p[i].a+0.005)*100; //注意此处控制精度,其实就是为了四舍五入
 42             int b = (p[i].b+0.005)*100;
 43             int c = (p[i].c+0.005)*100;
 44
 45             p[i].s.insert(a);
 46             p[i].s.insert(b);
 47             p[i].s.insert(c);
 48             p[i].s.insert(a+b);
 49             p[i].s.insert(a+c);
 50             p[i].s.insert(b+c);
 51             p[i].s.insert(a+b+c);
 52             p[i].s.insert(0);
 53             p[i].max_ = a+b+c;
 54         }
 55         bool ok = true;
 56         for(int i = 0; i < n; i++)
 57         {
 58             scanf("%d", &r[i]);
 59         }
 60         int ans = p[r[0]].max_;
 61         for(int i = 1; i < n; i++)
 62         {
 63             int last = r[i-1], now = r[i];
 64             if(last > now)
 65             {
 66                 if(*p[now].s.begin() >= ans)
 67                 {
 68                     ok = false;
 69                     break;
 70                 }
 71                 set<int>::iterator it = p[now].s.lower_bound(ans);
 72                 it--;
 73                 ans = *it;
 74             }
 75             else
 76             {
 77                 if(*p[now].s.begin() > ans)
 78                 {
 79                     ok = false;
 80                     break;
 81                 }
 82                 set<int>::iterator it = p[now].s.lower_bound(ans);
 83                 if(it == p[now].s.end() || *it > ans)
 84                 {
 85                     --it;
 86                     ans = *it;
 87                 }
 88             }
 89         }
 90         if(ok)
 91         {
 92             printf("Case %d: %.2lf\n", T++, (double)ans/100.00);
 93         }
 94         else
 95         {
 96             printf("Case %d: No solution\n", T++);
 97         }
 98     }
 99     return 0;
100 }

时间: 2025-01-17 19:22:30

UVa_Live 3664(精度坑)的相关文章

HDU 1418 抱歉(数学题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1418 Problem Description 非常抱歉,本来兴冲冲地搞一场练习赛,由于我准备不足,出现很多数据的错误,现在这里换一个简单的题目: 前几天在网上查找ACM资料的时候,看到一个中学的奥数题目,就是不相交的曲线段分割平面的问题,我已经发到论坛,并且lxj 已经得到一个结论,这里就不 多讲了,下面有一个类似的并且更简单的问题: 如果平面上有n个点,并且每个点至少有2条曲线段和它相连,就是说,

poj1113 凸包

result=对所有点凸包周长+pi*2*L WA了一次,被Pi的精度坑了 以后注意Pi尽可能搞精确一点.Pi=3.14还是不够用 Code: 1 #include<vector> 2 #include<list> 3 #include<map> 4 #include<set> 5 #include<deque> 6 #include<queue> 7 #include<stack> 8 #include<bitse

BigDecimal精度与相等比较的坑

先想一下,创建BigDecimal对象的时候一般是怎么创建的? new一个,传进去值 BigDecimal.valueOf方法,传进去值 作为一个数字类型,经常有的操作是比较大小,有一种情况是比较是否相等.用equal方法还是compareTo方法?这里就是一个大坑 1 //new 传进去一个double 2 BigDecimal newZero = new BigDecimal(0.0); 3 System.out.println(BigDecimal.ZERO.equals(newZero)

double精度的坑与BigDecimal

近期经常接触支付相关的功能,在开发及测试过程中,开始金额都使用的是double类型,而近期新进的需求存在支付时打折的情况,也就是会出现如 1.23元的情况,那么这时候问题来了,如果是直接使用1.23进行支付都是不存在问题的.而偏偏在支付前通常需要一些计算.我们的系统支持会员余额与三方支付(微信.支付宝)同时进行,比如一笔待支付的订单是12.8员,其中用户有5块钱的会员余额,剩下的7.8元通过三方支付进行(这里使用微信吧),那么就涉及到double减法,同时微信支付时需要将元转为分,就是7.8x1

golang踩坑之floa64精度丢失

问题:19.90转为float64类型,再乘以100,精度丢失 废话不说多,show you the code package main import ( "fmt" "strconv" ) func main() { num, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", 19.90), 64) fmt.Println(num) fmt.Println(num * 100) } 运行输出 19.9 19

[坑]c#中double转字符串精度丢失问题记录

在项目遇到了一个比较大的double值,然后出现了一些意想不到的状况: double b=1141.161994934082; b.ToString();//'1141.16199493408' 然后发现最后的一个2被丢弃了,最后经过测试这个跟double的数字位数有关,如果超过16位,最后一位就会被丢弃,也就是说2是第17位,所以被丢弃了,找了很多的办法都没有解决这个问题,所以记录一下. 在sql server 2014存进去这个数字的时候,是没有问题的,但是从查询管理器看到的数字也是少了一个

POJ 1759 Garland(二分+数学递归+坑精度)

POJ 1759 Garland  这个题wa了27次,忘了用一个数来储存f[n-1],每次由于二分都会改变f[n-1]的值,得到的有的值不精确,直接输出f[n-1]肯定有问题. 这个题用c++交可以过,g++交过不了, f[i]=2+2*f[i-1]-f[i-2]; f[0]=A,f[1]=x; 二分枚举x的值,最终得到B的值(不是f[n-1]), 上述递推式是非齐次的二阶递推式,解其齐次特征方程,可以得到f[n-1]的齐次时的表达式,对于非齐次的,目前我还没法求出通式, B与f[n-1]的关

正确生成浮点型的方法,解决sqlachemy Float浮点型的坑,生成float类型时,长度和精度均为0,导致查询不到结果!

问题描述 在使用flask_sqlachemy时,给price字段选择了Float类型,数据库用的mysql,生成数据库表后,发现 from sqlalchemy import Float,Column price = Column(Float,default=0.00) 虽然能存储float类型,结果如下 但是查询时有问题!!! 根本查不到结果 错误示例,还有如下几种 错误示范 from sqlalchemy import Column,Float from sqlalchemy.dialec

HDU 4082 Hou Yi&#39;s secret-求相似三角形的最大个数-(坑货)

题意:找相似三角形的最大个数.注意不是所有相似三角形的个数,而是不同类相似三角形 中个数最大的 分析: 之前理解成了所有相似三角形的个数,所以尽管考虑了所有的特殊情况以及精度问题还是不停的wawawa,甚至重新写了一遍不用余弦来判断而是用边.绝望之中仔细看别人的代码,原来题意理解错了. 这题的收获: 1.三角形相似的判定:用余弦定理.或者边成比例.最好用边,然后判定的时候不用比值,用乘积,这样就不存在精度问题. 2.耐心.对自己有信心. 代码: #include<iostream> #incl