POJ 3664 Election Time 题解
来源:互联网 发布:淘宝商家编码怎么写? 编辑:程序博客网 时间:2024/04/30 05:42
这道题网上很多人都会说容易,水题之类的话,不过我看了下说这样的话的人的程序,可以说他们的程序都不及格!
为什么呢?因为他们的程序都是使用简单的二次排序水过(大概你能搜索到的多是这样的程序),那样自然可以说不及格了。
因为本题真正的目的是求前k个最大数的问题,这就需要活用快速排序。
求前k个最大数的思路:
1 选取一个数位轴,然后把大于这个数的数放到数列前面,小于这个数的数放到数列后面
2 如果前面的数的数量大于k,那么可以去掉后面的数,递归在前面的数查找前k个最大数
3 如果前面的数的数量小于k,那么截去前面的数的数量,即k减去这些数量,然后在后面数列查找
4 如果前面的数刚好等于这个k,那么就可以返回了,找到前k个大数了。
然后主要是要注意细节问题,下标没计算好,会浪费很多调试时间的。
作者 靖心: http://blog.csdn.net/kenden23/article/details/30272701
最后AC的程序:
#include <cstdio>#include <vector>#include <limits.h>using namespace std;struct TripNums{int a, b, i;};void seleteK(vector<TripNums> &vtri, int l, int r, int k){vector<TripNums> fro, bac;int val = vtri[r].a;for (int i = l; i < r; i++){if (vtri[i].a < val) bac.push_back(vtri[i]);else fro.push_back(vtri[i]);}int i = l;for (int j = 0; j < (int)fro.size(); j++){vtri[i++] = fro[j];}vtri[i++] = vtri[r];if ((int)fro.size() == k || (int)fro.size()+1 == k) return ;if ((int)fro.size() > k){seleteK(vtri, l, l + (int)fro.size()-1, k);return ;}for (int j = 0; j < (int)bac.size(); j++){vtri[i++] = bac[j];}seleteK(vtri, l + (int)fro.size() + 1, r, k - (int)fro.size() - 1);}int main(){int N, K;while (~scanf("%d %d", &N, &K)){vector<TripNums> vtri(N);for (int i = 0; i < N; i++){scanf("%d %d", &vtri[i].a, &vtri[i].b);vtri[i].i = i;}seleteK(vtri, 0, N-1, K);int idx, M = INT_MIN;for (int i = 0; i < K; i++){if (vtri[i].b > M){idx = vtri[i].i;M = vtri[i].b;}}printf("%d\n", idx+1);}return 0;}
2 0
- POJ 3664 Election Time 题解
- poj 3664 Election Time
- poj 3664 Election Time
- POJ 3664 Election Time
- POJ 3664----Election Time
- POJ 3664 Election Time
- POJ 3664 Election Time 再想想
- POJ Election Time
- poj——3664——Election Time
- Election Time
- Election Time
- (Relax ST1.22)POJ 3664 Election Time(两次排序的巧妙应用)
- pku3664 Election Time
- BNUOJ 14362 Election Time
- POJ_3664 Election Time
- POJ3664 Election Time
- COJ - General Election 题解
- POJ3664——Election Time
- 三点一抹 联合工设系毕业展
- iPhone4s经常出现无线局域网连不上啊,按钮还变灰了,是什么情况。
- java中Comparator的用法
- 日本餐厅提供陪伴娃娃服务,让你吃饭终结孤单!
- 转:Fragment报java.lang.IllegalArgumentException:No view found for id 0x的错误
- POJ 3664 Election Time 题解
- Hadoop 多表 join:map side join 范例
- mina的编码和解码以及断包的处理,发送自定义协议,仿qq聊天,发送xml或json
- Android 动画之ScaleAnimation应用详解
- json基础知识和一般处理
- 【ubuntu】 nginx配置phpmyadmin
- Spark:大数据的电花火石!
- JDK和JRE的区别
- 使用接口实现函数的回调