HDU_1009 (贪心问题)
2015-12-02 12:49
423 查看
#include<bits/stdc++.h> using namespace std; const int maxn = 1000+5; double best_v[maxn]; int J[maxn], F[maxn]; int e[maxn]; bool cmp(int i, int j){ return best_v[i] > best_v[j]; } int main(){ int M, N; while(scanf("%d%d", &M, &N)!=EOF && (M!=-1 || N!=-1)) { for(int i = 0; i < N; i++) { scanf("%d%d", &J[i], &F[i]); best_v[i] = J[i]*1.0/F[i]; e[i] = i; } sort(e, e+N, cmp); double sum = 0; int t = 0; //这里忘记初始化了 t表示当前房间 while(M&&t<N) {//一共质量为M //循环体写成这样的好处是 每次循环必然“消耗掉一个房间” if(M > F[e[t]]) { M -= F[e[t]]; sum += J[e[t]]; t++; } else{ sum += best_v[e[t]]*M; break; /* 之前这里思路混乱 sum += best_v[e[t]]; cnt++; M--; if(cnt >= F[e[t]]) { t++; cnt = 0; } */ } //判断好t的边界 如果t把N个房间全部都走了一遍 即使猫粮还有剩余 //还是要跳出这个循环 //加一个判断 //或者不要这一句 然后把while(M)换成while(M&&N--) 或 while(M&&t<N) //if(t >= N) break; 但是写在这里就是会错 我也弄不懂为什么 } printf("%.3lf\n", sum); } return 0; }
//while循环部分遇到一个问题 //写成这样就AC while(M&&t<N) { if(M > F[e[t]]) { M -= F[e[t]]; sum += J[e[t]]; t++; } else{ sum += best_v[e[t]]*M; break; } } //写成这样就报错 while(M) { if(M > F[e[t]]) { M -= F[e[t]]; sum += J[e[t]]; t++; } else{ sum += best_v[e[t]]*M; break; } if(t >= N) break; } //实在不懂为什么
相关文章推荐
- iOS_tableview 修改分割线位置(兼容IOS8)
- 本地json文件的编辑器,node-webkit开发的exe程序
- Sql Server Data compression 预估和选择,以及查看成功压缩的数据页
- c++编程必备啊..
- RVM 解决 Ruby 的版本问题
- 提示Android APP性能
- NSURLConnection 实现webView显示HTTPS页面
- LeetCode 37 Sudoku Solver(求解数独)(*)
- centos6.5使用JMX时远程连接不上的问题
- LintCode: First Position of Target
- string类的写时拷贝(Copy-On-Write)
- Exercises 3.17 输入一段文字到string类型的vector中,并将其改为大写
- Smash fear, learn anything 无所畏惧,学无止境-Tim Ferriss的Ted
- Android注释规范
- 连写数
- HDU 1023 Train Problem II
- Apriori算法 (Introduction to data mining)
- iOS开发之事件的产生和传递
- android Audio Capture
- 杭电acm4535