[La pensée et de la pratique de programmation travail Semaine4 C] TT cadeau mystère

Description du sujet:

Compte tenu de chat de tableau [i] un nombre N, et générer un nouveau tableau de ans [i] avec le tableau. Il est défini comme le nouveau tableau pour tout i, j et i = j, sont ans [] = abs (cat [i] - cat [j]) !, 1 <= i <j <= N. Cette nouvelle matrice. Déterminer la médiane, la médiane est le tri (len + 1) / 2 correspondant au numéro de position, « / » est un arrondi.

entrée:

plusieurs ensembles d'entrées, chaque entrée une N, le nombre N exprimé, après l'entrée d'une séquence de chat longueur de N, cat [i] <= 1e9, 3 <= n <= 1e5.

Inpout échantillon:

4
1 3 2 4
3
1 10 2

sortie:

nouveau tableau de sortie ans médiane

Sortie de l'échantillon:

1
8

idées:

Pour tableau d'entrée de chat, nous pouvons connaître la taille des ans de tableau, afin que nous puissions connaître le rang médian, à savoir le nombre inférieur au nombre de bits, un nombre donné P, si elle est inférieur au rang médian nombre, il est inférieur à la médiane, si le rang est supérieur à la médiane, ce qui est supérieur à la médiane. Nous pouvons voir que la réponse est monotone et peut donc être considéré comme la moitié de la pratique. Le chat nous trier le tableau, le tableau peut être ans i <j, chat [j] -chat [i] est obtenu, pour atteindre l'objectif de la valeur absolue, nous pouvons rapprocher la gamme médiane peut être déterminée, à savoir le dernier tableau Enregistrez le premier numéro est un numéro qui est une valeur maximale, doit être supérieur à zéro et, par conséquent, nous pouvons gamme médiane de la moitié et la moitié en fonction du nombre obtenu, qui détermine alors la taille médiane est plus grande que si la médiane, la moitié de la première moitié, soit la moitié de la seconde moitié.
A cette époque, la question restante des données binaires donnée P obtenue avec une taille moyenne de sa détermination, à savoir, détermine le nombre inférieur au nombre de ses [x parce ans] <P, à savoir cat [j] -chat [i] <p (i < j) à savoir cat [i] + P> cat [j], dans lequel on parcourt i, j , on obtient une gamme de moins que le nombre de données obtenues est appelée COUNT P, nous obtention de données égale à P est également désigné comme étant le nombre de temp.
si le nombre <cible && compte + temp> rang médian appelé cible, = cible alors P est la médiane, sinon, si le nombre + température <cible est inférieure à la P médiane, de poursuivre la plage de la seconde moitié de chiffres binaires, puis P est supérieur à la médiane, il y a deux minutes et demie continue. Jusqu'à ce que la médiane.

code:

#include <iostream>
#include<algorithm>
using namespace std; 
const int size=1e5+10;
int number[size];
int end(int x,int left,int n)
{//小于x的最后一个数 
	int ans=-1;
	int ll=left+1,rr=n-1;
	while(ll<=rr)
	{
		int mid=(ll+rr)>>1;
		if(number[mid]<x)
		{
			ans=mid;
			ll=mid+1;
		}
		else
			rr=mid-1;
	}
	return ans;
}
int getans(int n)
{
	int right=number[n-1]-number[0];
	int left=0;
	int sum=0;
	for(int i=1;i<n;i++)
		sum+=i;
	int target=(sum+1)/2;
	while(left<=right)
	{
		int mid=(left+right)>>1;
		int count=0,temp=0,ans=0;
		for(int i=0;i<n;i++)
		{
			int en=end((mid+number[i]),i,n);
			if(en!=-1)
			{
				count+=(en-i);	
				for(int j=en+1;j<n&&number[j]==(number[i]+mid);j++)
					temp++;			
			}
			else
				for(int j=i+1;j<n&&number[j]==(number[i]+mid);j++)
					temp++;	
		}
		if(count<target&&(count+temp)>=target)
			return mid;
		else if(count+temp<target)
			left=mid+1;
		else
			right=mid-1;	
	}
}
int main(int argc, char** argv) {
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		for(int i=0;i<n;i++)
			scanf("%d",&number[i]);
		sort(number,number+n);
		int ans=getans(n);
		printf("%d\n",ans);
	}
	return 0;
}
Publié 24 articles originaux · éloge de won 8 · vues 531

Je suppose que tu aimes

Origine blog.csdn.net/weixin_44034698/article/details/104875013
conseillé
Classement