这道题网上非常多人都会说easy,水题之类的话,只是我看了下说这种话的人的程序,能够说他们的程序都不及格!

为什么呢?由于他们的程序都是使用简单的二次排序水过(大概你能搜索到的多是这种程序)。那样自然能够说不及格了。

由于本题真正的目的是求前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;
}

POJ 3664 Election Time 题解的更多相关文章

  1. POJ 2823 Sliding Window 题解

    POJ 2823 Sliding  Window 题解 Description An array of size n ≤ 106 is given to you. There is a sliding ...

  2. POJ 2643 Election map

    POJ 2643 Election 第一次写博客,想通过写博客记录自己的ACM历程,也想解释下英文题目,写些自己的理解.也可以让自己以后找题目更加方便点嘛.ElectionTime Limit: 10 ...

  3. POJ 2585 Window Pains 题解

    链接:http://poj.org/problem?id=2585 题意: 某个人有一个屏幕大小为4*4的电脑,他很喜欢打开窗口,他肯定打开9个窗口,每个窗口大小2*2.并且每个窗口肯定在固定的位置上 ...

  4. poj 3664

    http://poj.org/problem?id=3664 进行两轮选举,第一轮选前n进入第二轮,第二轮选最高 #include<algorithm> #include<cstdi ...

  5. Poj 1659.Frogs' Neighborhood 题解

    Description 未名湖附近共有N个大小湖泊L1, L2, ..., Ln(其中包括未名湖),每个湖泊Li里住着一只青蛙Fi(1 ≤ i ≤ N).如果湖泊Li和Lj之间有水路相连,则青蛙Fi和 ...

  6. poj 3264 Balanced Lineup 题解

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Subm ...

  7. poj 3258 River Hopscotch 题解

    [题意] 牛要到河对岸,在与河岸垂直的一条线上,河中有N块石头,给定河岸宽度L,以及每一块石头离牛所在河岸的距离, 现在去掉M块石头,要求去掉M块石头后,剩下的石头之间以及石头与河岸的最小距离的最大值 ...

  8. POJ 1737 Connected Graph 题解(未完成)

    Connected Graph Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 3156   Accepted: 1533 D ...

  9. POJ 2643 Election

    Election Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3558   Accepted: 1692 Descript ...

随机推荐

  1. ZooKeeper分布式集群部署及问题

    ZooKeeper为分布式应用系统提供了高性能服务,在许多常见的集群服务中被广泛使用,最常见的当属HBase集群了,其他的还有Solr集群.Hadoop-2中的HA自己主动故障转移等. 本文主要介绍了 ...

  2. SQL语法精讲(包括建库、建表、建视图、查询、增加、删除、)

    SQL语法精讲(包括建库.建表.建视图.查询.增加.删除.修改) SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELE ...

  3. 敏捷开发 —— TDD(测试驱动开发)

    测试驱动开发 TDD(Test-Driven Development)是敏捷开发的一项核心实践,同时也是一种设计技术和方法. 既然是测试驱动,便是测试,测试用例先行: 首先编写好测试用例,期待值,实际 ...

  4. [IOI 1998] Polygon

    [题目链接] http://poj.org/problem?id=1179 [算法] 区间DP [代码] #include <algorithm> #include <bitset& ...

  5. Java基础——选择排序、冒泡排序

    1.选择排序 原理是直接从待排序数组里选择一个最小(或最大)的数字,每次都拿一个最小数字出来, 顺序放入新数组,直到全部拿完 代码演示: public class Test3 { public sta ...

  6. jquery应用实例1:手风琴特效

    效果: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  7. E5中遍历数组的方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 关于idlf无法输入中文的解决办法

    最近在学习python 但是刚开始写程序的时候发现无法输入中文  上网查发现有不少mac端的IDLF也存在这个问题 导致这个问题的原因可能不唯一 但是大多数原因应该是Mac 系统自带的 Tcl/Tk ...

  9. PHP关于注册注意的问题

    1.注意转义字符的问题 get_magic_quotes_gpc()开启时,所有的 ' (单引号), " (双引号), \(反斜线) and 空字符(null)会自动转为含有反斜线的溢出字符 ...

  10. hdu 1166 敌兵布阵 【线段树】

    好好学一下线段树---- 从0开始----加油- 单点更新的 #include<cstdio> #include<cstring> #include<iostream&g ...