POJ 3664 Election Time 题解
这道题网上非常多人都会说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 题解的更多相关文章
- POJ 2823 Sliding Window 题解
POJ 2823 Sliding Window 题解 Description An array of size n ≤ 106 is given to you. There is a sliding ...
- POJ 2643 Election map
POJ 2643 Election 第一次写博客,想通过写博客记录自己的ACM历程,也想解释下英文题目,写些自己的理解.也可以让自己以后找题目更加方便点嘛.ElectionTime Limit: 10 ...
- POJ 2585 Window Pains 题解
链接:http://poj.org/problem?id=2585 题意: 某个人有一个屏幕大小为4*4的电脑,他很喜欢打开窗口,他肯定打开9个窗口,每个窗口大小2*2.并且每个窗口肯定在固定的位置上 ...
- poj 3664
http://poj.org/problem?id=3664 进行两轮选举,第一轮选前n进入第二轮,第二轮选最高 #include<algorithm> #include<cstdi ...
- Poj 1659.Frogs' Neighborhood 题解
Description 未名湖附近共有N个大小湖泊L1, L2, ..., Ln(其中包括未名湖),每个湖泊Li里住着一只青蛙Fi(1 ≤ i ≤ N).如果湖泊Li和Lj之间有水路相连,则青蛙Fi和 ...
- poj 3264 Balanced Lineup 题解
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Subm ...
- poj 3258 River Hopscotch 题解
[题意] 牛要到河对岸,在与河岸垂直的一条线上,河中有N块石头,给定河岸宽度L,以及每一块石头离牛所在河岸的距离, 现在去掉M块石头,要求去掉M块石头后,剩下的石头之间以及石头与河岸的最小距离的最大值 ...
- POJ 1737 Connected Graph 题解(未完成)
Connected Graph Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3156 Accepted: 1533 D ...
- POJ 2643 Election
Election Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3558 Accepted: 1692 Descript ...
随机推荐
- Java ZIP压缩和解压缩文件(解决中文文件名乱码问题)
Java ZIP压缩和解压缩文件(解决中文文件名乱码问题) 学习了:http://www.tuicool.com/articles/V7BBvy 引用原文: JDK中自带的ZipOutputStrea ...
- HDU 5372 Segment Game
/** 多校联合2015-muti7-1004 <a target=_blank href="http://acm.hdu.edu.cn/showproblem.php?pid=537 ...
- 串口之CreateFile 函数具体解释
HANDLE CreateFile( LPCTSTR lpFileName, //指向文件名称的指针 DWORD dwDesiredAccess, //訪问模式(写/读) DWORD dwShareM ...
- 朴素的UNIX之-调度器细节
0.多进程调度的本质 我们都知道UNIX上有一个著名的nice调用.何谓nice,当然是"好"了.常规的想法是nice值越大越好,实际上,nice值越好,自己的优先级越低.那么为何 ...
- BZOJ 2435: [Noi2011]道路修建 dfs搜图
2435: [Noi2011]道路修建 Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他 ...
- [JavaEE]Hibernate 所有缓存机制详解
Hibernate提供的一级缓存 hibernate是一个线程对应一个session,一个线程可以看成一个用户.也就是说session级缓存(一级缓存)只能给一个线程用,别的线程用不了,一级缓存就是和 ...
- Extjs 常见错误
http://blog.csdn.net/lc448986375/article/details/8082014
- Hessian Spirng实例
Spring实例 之前,我们做了很简单的纯Hessian的调用,虽然到此已经能够满足远程调用的需求了,但是我听说spring也能够访问hessian的远程服务,研究了一番,废话不多说,直接上示例. 业 ...
- android编译ffmpeg+x264
下载最新版的x264ftp://ftp.videolan.org/pub/videolan/x264/snapshots/1.解压到指定的目录2.切换当前目录为该目录3.创建一个shell脚本buil ...
- Android 高大上的侧滑菜单DrawerLayout,解决了不能全屏滑动的问题
DrawerLayout预览 DrawerLayout主要功能就是 实现侧滑菜单效果的功能,并且可以通过增加一些设置来实现高大上的效果,那么就请看动态图: 注意左上角那个图标,有木有很好玩,哈哈. ...