HDU 1029 Ignatius and the Princess IV / HYSBZ(BZOJ) 2456 mode(思維題,~~排序?~~)


HDU 1029 Ignatius and the Princess IV (思維題,排序?

Description

"OK, you are not too bad, em... But you can never pass the next test." feng5166 says.

"I will tell you an odd number N, and then N integers. There will be a special integer among them, you have to tell me which integer is the special one after I tell you all the integers." feng5166 says.

"But what is the characteristic of the special integer?" Ignatius asks.

"The integer will appear at least (N+1)/2 times. If you can't find the right integer, I will kill the Princess, and you will be my dinner, too. Hahahaha....." feng5166 says.

Can you find the special integer for Ignatius?

Input

The input contains several test cases. Each test case contains two lines. The first line consists of an odd integer N(1<=N<=999999) which indicate the number of the integers feng5166 will tell our hero. The second line contains the N integers. The input is terminated by the end of file.

Output

For each test case, you have to output only one line which contains the special number you have found.

Sample Input

5
1 3 2 3 3
11
1 1 1 1 1 5 5 5 5 5 5
7
1 1 1 1 1 1 1

Sample Output

3
5
1

Http

https://vjudge.net/problem/HDU-1029

Source

思維題,排序?

題目大意

給一個保證個數n為奇數個的數列,求里面那個出現了至少n/2+1次的數

解決思路

因為我們要輸出的數出現了至少n/2+1次,所以我們用一個cnt記錄當前某個數的出現次數(看不懂?沒關系,往下看)。每讀入一個數,我們看一下當前的cnt是否是0,如果是0,則把Ans更新為當前讀入的數並把cnt置為1,否則,如果Ans與當前讀入的數相同,則cnt+1,否則-1。
這個算法的正確性在於因為我們要輸出的Ans的次數是大於等於n/2+1的,也就是說它出現的次數是大於其他所有數出現次數之和的。所以我們利用上面的方法,可以保證最后cnt記錄的就是Ans。
另:強烈建議本題擴大數據范圍,因為這題還可以用sort水過。因為要輸出的數出現了至少n/2+1次,所以只要把所有的數排一邊序,可以保證第n/2+1個數就是答案。
2017.8.26 Update
原代碼在BZOJ上會MLE,原因是使用了std。請看最簡化版

代碼

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;

int main()
{
	int n;
	while (cin>>n)
	{
		int cnt=0,Ans=0;
		for (int i=1;i<=n;i++)
		{
			int number;
			scanf("%d",&number);
			if (cnt==0)
			{
				cnt=1;
				Ans=number;
				continue;
			}
			if (number==Ans)
				cnt++;
			else
				cnt--;
		}
		printf("%d\n",Ans);
	}
	return 0;
}	

最簡化版

#include<cstdio>
 
int main()
{
    int n;
    scanf("%d",&n);
        int cnt=0,Ans=0;
        for (int i=1;i<=n;i++)
        {
            int number;
            scanf("%d",&number);
            if (cnt==0)
            {
                cnt=1;
                Ans=number;
                continue;
            }
            if (number==Ans)
                cnt++;
            else
                cnt--;
        }
        printf("%d\n",Ans);
    return 0;
}   

sort暴力方法:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;

const int maxN=1000000;
const int inf=2147483647;

int n;
int Arr[maxN];

int main()
{
	while (cin>>n)
	{
		for (int i=1;i<=n;i++)
			scanf("%d",&Arr[i]);
		sort(&Arr[1],&Arr[n+1]);
		printf("%d\n",Arr[n/2+1]);
	}
	return 0;
}

為什么這題會出現在[kuangbin帶你飛]的專題十二 基礎DP1里?很迷……
此處輸入圖片的描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM