[La pensée et la pratique de programmation Semaine4 travail quatre colonnes B]

Description du sujet:

ZJM comporte quatre colonnes A, B, C, D, chaque colonne comporte le nombre de chiffres n. ZJM un nombre pris de chaque numéro de colonne respective, il aimerait savoir combien de types de programmes tels que le nombre de 4 et 0.
Quand un certain nombre de colonnes a la même pluralité de nombres, de les traiter comme un numéro différent.

Formats d'entrée:

La première ligne: n (nombre représentatif du nombre de colonnes) (1≤n≤4000)
suivant le n-ième rangée, le i-ième rangée de quatre nombres, chaque nombre représente la i-ième colonne de A, B, C, D de chiffres (chiffres 2 à la puissance de pas plus de 28)

Entrée de l'échantillon:

6
-45 22 42 -16
-41 -27 56 30
-36 53 -37 77
-36 30 -75 -46
26 -38 -10 62
-32 -54 -6 45

formats de sortie:

Le nombre de combinaisons différentes de sortie.

Sortie de l'échantillon:

5

idées:

Si les données et habitent sur, n atteindra 4 après la complexité, beaucoup de temps, donc nous utilisons deux tableaux avant la première utilisation Enumérer, les enregistrer, puis deux tableaux et énumération tandis que deux tableaux avant de voir le contraire de combien, et inclus dans la réponse. Une telle complexité peut être réduite à n- 2 . Dans le calcul de l'inverse du nombre, ont été utilisés notation de la carte, mais toujours pas de réponse, nous choisissons donc de trier le tableau et le tableau des deux premiers, puis la moitié, qui cherchent à trouver un certain nombre de premier et dernier la position, en obtenant ainsi les données cibles (les deux réseaux et le nombre inverse) nombre.

code:

#include <iostream>
#include<map>
#include<vector>
#include<algorithm>
#include<string.h>
using namespace std;
const int size=4000+10;
int d[4][size];
int sum[size*size];
int begin(int x,int left,int right)
{
	int ans=-1;
	while(left<=right)
	{
		int mid=(left+right)>>1;
		if(sum[mid]==x)
		{
			ans=mid;
			right=mid-1;
		}
		else if(sum[mid]<x)
			left=mid+1;
		else
			right=mid-1;
	}
	return ans;
}
int end(int x,int left,int right)
{
	int ans=-1;
	while(left<=right)
	{
		int mid=(left+right)>>1;
		if(sum[mid]==x)
		{
			ans=mid;
			left=mid+1;
		}
		else if(sum[mid]<x)
			left=mid+1;
		else
			right=mid-1;
	}
	return ans;
}
int main(int argc, char** argv) {
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		scanf("%d%d%d%d",&d[0][i],&d[1][i],&d[2][i],&d[3][i]);
	}
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			sum[i*n+j]=d[0][i]+d[1][j];
		}
	}
	sort(sum,sum+n*n);
	int count=0;
	int l,r;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			int temp=d[2][i]+d[3][j];
			temp=0-temp;
			l=begin(temp,0,n*n-1);
			if(l==-1)
				continue;
			r=end(temp,0,n*n-1);
			count+=(r-l+1);
		}
	}
	cout<<count<<endl;
	return 0;
}
Publié 25 articles originaux · éloge de won 8 · vues 532

Je suppose que tu aimes

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