zoukankan      html  css  js  c++  java
  • 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
    ", idx+1);
    	}
    	return 0;
    }



  • 相关阅读:
    网站统计中的数据收集原理及实现
    启动hadoop报ERROR org.apache.hadoop.hdfs.server.namenode.FSImage: Failed to load image from FSImageFile
    淘宝(大数据库应用)--转载
    MapReduce作业的map task和reduce task调度参数
    Spark和Hadoop作业之间的区别
    分析MapReduce执行过程
    MapReduce框架Partitioner分区方法
    LVS+keepalived实现负载均衡
    Tomcat 详解
    linux Tomcat restart脚本简单版
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/7017501.html
Copyright © 2011-2022 走看看