UVa_Live 3664(精度坑)
2015-08-27 19:06
260 查看
题意很好理解的贪心题,然而却卡疯了的精度坑。
再次理解一下double小数运算时可能导致的精度问题,本题为避免该问题可以将小数乘以100化为整数进行比较,输出的时候再除以100就ok;
思路也很好想,数据也不大,直接贴代码吧。
#include <cstdio> #include <iostream> #include <sstream> #include <cmath> #include <cstring> #include <cstdlib> #include <string> #include <vector> #include <map> #include <set> #include <queue> #include <stack> #include <algorithm> using namespace std; #define ll long long #define _cle(m, a) memset(m, a, sizeof(m)) #define repu(i, a, b) for(int i = a; i < b; i++) #define repd(i, a, b) for(int i = b; i >= a; i--) #define sfi(n) scanf("%d", &n) #define pfi(n) printf("%d\n", n) #define MAXN 100010 const int maxn = 16400; struct Player { double a, b, c; int max_; set<int> s; } p[maxn]; int r[maxn], vis[maxn]; int main() { int n; int T = 1; while(~scanf("%d", &n) && n) { for(int i = 0; i <= n; i++) p[i].s.clear(); for(int i = 1; i <= n; i++) { scanf("%lf%lf%lf", &p[i].a, &p[i].b, &p[i].c); int a = (p[i].a+0.005)*100; //注意此处控制精度,其实就是为了四舍五入 int b = (p[i].b+0.005)*100; int c = (p[i].c+0.005)*100; p[i].s.insert(a); p[i].s.insert(b); p[i].s.insert(c); p[i].s.insert(a+b); p[i].s.insert(a+c); p[i].s.insert(b+c); p[i].s.insert(a+b+c); p[i].s.insert(0); p[i].max_ = a+b+c; } bool ok = true; for(int i = 0; i < n; i++) { scanf("%d", &r[i]); } int ans = p[r[0]].max_; for(int i = 1; i < n; i++) { int last = r[i-1], now = r[i]; if(last > now) { if(*p[now].s.begin() >= ans) { ok = false; break; } set<int>::iterator it = p[now].s.lower_bound(ans); it--; ans = *it; } else { if(*p[now].s.begin() > ans) { ok = false; break; } set<int>::iterator it = p[now].s.lower_bound(ans); if(it == p[now].s.end() || *it > ans) { --it; ans = *it; } } } if(ok) { printf("Case %d: %.2lf\n", T++, (double)ans/100.00); } else { printf("Case %d: No solution\n", T++); } } return 0; }View Code
相关文章推荐
- 使用logrotate配置Nginx日志轮替
- UITableView的编辑
- 一个Hibernate小程序
- python 高级属性
- 程序员,请远离拖延症!
- CTR预估中GBDT与LR融合方案
- OC开发_整理笔记——友盟分享(社交化组件)
- wait和sleep
- ListView分组导航+挤压动画(二)
- window.onunload使用
- 求一个小于10的正整数的n次方,n很大
- 杭电ACM2076--夹角有多大(题目已修改,注意读题)
- 杭电ACM2076--夹角有多大(题目已修改,注意读题)
- 乐观锁和悲观锁
- 数据库--事务(定义、基本特征、并发问题)
- poj 1068 Parencodings(模拟)
- 责任链模式-- chainResponsibility
- Emacs 学习(五)
- Catalan 卡特兰数
- 服务器软件相关问题