concepção do programa de pensamento empregos Week4-

empregos Week4- programação detalhada

A-DDL medo

Descrição

ZJM existem n postos de trabalho, cada trabalho tem seu próprio DDL, se ZJM não feito o trabalho antes do DDL, em seguida, o professor irá deduzir este trabalho todos os pontos habituais. Então ZJM quer saber como organizar a ordem de trabalhos de casa a fivela um pouco menos pontos quanto possível.
Entrada de teste T. Cada valor de teste de trabalho tem N (1 <= N <= 1000 ), e são dedução DDL de entrada dos postos de trabalho fraccionada-N.
A saída de cada caso de teste, pelo menos, pontuação fivela.

Amostra

input:
3
3
3 3 3
10 5 1
3
1 3 1
6 2 3
7
1 4 6 4 2 4 3
3 2 1 7 6 5 4

output:
0
3
5

Idéia

Em primeiro lugar, ele contém o ddl e deduzidos pontos para cada estrutura de costume trabalho. N trabalho para cada caso de ensaio, a primeira ordem de diminuir a DDL, e, em seguida, de trás para a frente enumerar todos os dias, um programa do dia para cada tarefa, a partir do primeiro elemento da matriz, para enumerar a x dias, todos DDL = x trabalho máxima pilha foi adicionado (pontuação máxima pilha tipo fivela de acordo com cada posto de trabalho), e, em seguida, para fora do topo da pilha a partir da maior pilha de elementos, para providenciar esta dias, adicionado ou deduzidos pontos até uma enumeração completa dia, se o heap máximo não está vazia, em seguida, estes trabalhos estão atrasados, acrescentando pontuação fivela. A fivela total final de saída pontuação

resumo

A idéia básica de resolver o problema é um algoritmo guloso, critério ganancioso é para a frente por um dia do final, para o dia para organizar DDL> = a fração fivela dia de trabalho maior trabalho, deixando menos pontos deduzidos.
A partir da parte de trás do enumerados adicionado apenas no dia x = x DDL assegurar o trabalho para o primeiro dia x, o funcionamento máxima da pilha DDL são maiores do que ou igual x, DDL faz não erroneamente pequenas ligações de trabalho para fora do montão o tempo limite de trabalho.

códigos

#include <iostream>
#include <algorithm>
#include<cstdio>
#include<cstdlib>
#include <vector>
#include<queue>
using namespace std;
int T;
struct task {
	int DDL, s;
	//bool operator()(const task &t) {
	//	return s  t.s;
	//}
}P[1100];
struct cmp {
	bool operator()(task a, task b) {
		return a.s < b.s;
	}
};
bool compare(const task &a, const task &b) {
	return a.DDL > b.DDL;
}

int main()
{
	cin.sync_with_stdio(false);
	cin >> T;
	while (T--) {
		int N;
		cin >> N;
		//memset(P, 0, sizeof(task));
		//memset(s, 0, sizeof(int));
		int score = 0;

		for (int i = 0; i < N; i++)
			cin >> P[i].DDL;
		for (int i = 0; i < N; i++)
			cin >> P[i].s;
		sort(P, P + N,compare);
		int index = 0;
		priority_queue<task,vector<task>,cmp > Q;
		for (int t = 1010; t >= 1; t--) {
			//if (index >= N)break;
			for (; index <N; index++) {
				
				if (P[index].DDL == t) { Q.push(P[index]); }
				else if (P[index].DDL < t)break;
			}
			if (!Q.empty()) {
				task temp = Q.top();
				
				Q.pop();
				//if (temp.DDL < t) { score += temp.s;  }

			}

		}
		while (!Q.empty()) {
			task temp = Q.top();
			Q.pop();
			score += temp.s;
			/*cout << temp.s << endl;*/
		}

		cout << score << endl;

	}

}


B- quatro colunas

Descrição

ZJM tem quatro colunas A, B, C, D, cada coluna tem o número de dígitos n. ZJM um número tirado de cada respectivo número de coluna, ele gostaria de saber quantos tipos de programas tais que o número de 4 e 0. Quando um número de colunas tem a mesma pluralidade de números, tratá-los como um número diferente.
N para o número de colunas de quatro elementos, o número de diferentes combinações de saída.

Amostra

input:
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

output:
5

Idéia

Em primeiro lugar, cada um de A e enumeração de número B, A + B foi adicionada a cada um número de colunas, o número de colunas em ordem ascendente, e, em seguida, enumerar o número de cada um de C e D, para cada um de C + D, em busca do seu número oposto o número que aparece no número da coluna, isto é, a sequência ordenada para localizar a primeira e última - (C + D), onde a necessidade de utilizar uma pesquisa binária, respectivamente, para localizar a primeira e a última, a soma dos dois números subtrair adicionou a soma final é o número de combinações diferentes.

resumo

Em um aspecto, para reduzir a complexidade, e AB, respectivamente, devem enumerar CD, e em seguida, cada número enumerador ABCD, a complexidade chegará à quarta potência, igual à soma dos quatro números 0, corresponde a A + B = - (C + D). Por outro lado, a chave para esta questão é encontrar a localização de um número de primeira ocorrência e a última ocorrência de uma seqüência ordenada, onde o uso de busca binária, a complexidade é reduzida a conecte-se membros.

códigos

#include <iostream>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
int n;
int A[4010];
int B[4010];
int C[4010];
int D[4010];
vector<int> AB;
int sum = 0;

int find1(int x) {
	int l = 0, r = AB.size() - 1, ans = -1;
	while (l <= r) {
		int mid = l + r >> 1;
		if (AB[mid] == x) {
			ans = mid;
			r = mid - 1;
		}
		else if (AB[mid] > x)r = mid - 1;
		else l = mid + 1;
	}
	return ans;
}

int find2(int x) {
	int l = 0, r = AB.size() - 1, ans = -1;
	while (l <= r) {
		int mid=(l + r) >> 1;
		if (AB[mid] == x) {
			ans = mid;
			l = mid + 1;
		}
		else if (AB[mid] > x)r = mid - 1;
		else l = mid + 1;
	}
	return ans;
}

int main()
{
	cin.sync_with_stdio(false);
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> A[i] >> B[i] >> C[i] >> D[i];
	for(int i=0;i<n;i++)
		for (int j = 0;j < n; j++)
		{
			AB.push_back(A[i] + B[j]);
		}
	sort(AB.begin(), AB.end());
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++) {
			int temp = -(C[i] + D[j]);
			int first = find1(temp);
			int last = find2(temp);

			if (first != -1 && last != -1) { sum += last - first + 1; }
			

		}

	cout << sum << endl;

}


misterioso dom da C-TT

Descrição

gato matriz dado [i] um número N, e gerar um novo ans matriz [I] com a matriz. É definida como a nova matriz para qualquer i, j e i = j, são ans [] = ABS (gato [i] - gato [j]) !, 1 <= i <j <= N. Esta nova matriz. Determinar a mediana, em seguida, a mediana é o tipo (len + 1) / 2 que corresponde ao número de posição, '/' é um arredondamento.

conjuntos plurais de entradas, cada uma entrada de N, o número N expressa, após a entrada de uma sequência de comprimento N gato, gato [i] <= 1E9, 3 <= n <= 1e5. nova matriz de saída ans mediano

Amostra

input:
4
1 3 2 4
3
1 10 2

output:
1
8

Idéia

faixa de cálculo da matriz original são classificados primeiros novos valores de elementos de matriz, neste intervalo encontrar uma resposta binário P, P é o número de bits para cada P em P calcula nova sequência de classificação.
Como o número de colunas do original foi ordenado, o valor absoluto pode ir para dar Xj <= Xi + P, subscrito i é então calculada enumerar o número do índice j satisfazendo a condição calculada aqui também é possível usar uma pesquisa binária para encontrar a primeira é maior ou igual a número Xi + P de posições, e a soma final de todos os j satisfazendo a condição, isto é, os tuplos que beneficiam de números, e comparando o número médio de classificação, a classificação é menos do que a mediana é o direito mediano lado, se a média é maior do que uma posição mediana do lado esquerdo, o novo elemento de matriz correspondente valor de pesquisa gama actualização e, em seguida, se os dois números são iguais, P é a mediana.

Suponhamos que o número 4, respectivamente, 1,3,2,4
resposta -metade como se segue:
Aqui Insert Picture Descrição

resumo

P resposta binário, o cálculo enumeração de P i + dois Classificação
uma vez que os elementos de armazenamento depois de começar a partir de 0, a mediana é o código de tipo (len + 1) / 2-1 que corresponde aos números de posição. Esta questão para uma determinada chave é como determinar um número que não é a mediana, em vez do novo número de colunas para a mediana calculada de seus elementos deve pertencer a uma nova série de [0, cat_max-cat_min]. Como calcular o número de tuplas em pensar no tempo relativamente longo.

códigos

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int N;
int cat[100010];


int find(int x) {
	int l = 0, r = N - 1, ans = N;
	while (l <= r) {
		int mid = l + r >> 1;
		if (cat[mid] >= x) {
			ans = mid;
			r = mid - 1;
		}
		else if (cat[mid] > x)r = mid - 1;
		else l = mid + 1;
	}
	return ans;
}


int main()
{
	while (scanf("%d",&N)!=EOF) {
		for (int i = 0; i < N; i++)
			 scanf("%d",&cat[i]);
		sort(cat, cat + N);

		int min = 0, max = cat[N - 1] - cat[0],P;
		int index = (N*(N - 1) / 2 + 1) / 2-1;
		//二分答案
		while (min < max) {
			P = (min + max) >> 1;
			int pos = 0;		
			for (int i = 0; i < N; i++)
				pos += N - find(cat[i] + P);		//枚举i,计算满足条件的j的个数
			if (pos >= N*(N - 1) / 2 - index)min = P + 1;
			else max = P;
		}
		printf("%d\n", min - 1);
	}
}


Publicado 21 artigos originais · ganhou elogios 5 · Visualizações 784

Acho que você gosta

Origin blog.csdn.net/weixin_44578615/article/details/104846940
Recomendado
Clasificación