문제 보고서에 GDUT_ 겨울 훈련 솔루션 _ 문제 보고서 항목 제목 I_I 개인 솔루션

문제 보고서에 GDUT_ 겨울 훈련 솔루션 _ 문제 보고서 항목 제목 I_I 개인 솔루션

일기 : 다음 날, 첫날보다 더 어려운, 오후 10시에, 하나의 주제 (A)는, 반 구운 불완전한 데이터 구조는 구매의 구조를 반영하지 A, Orz을 BFS를 배우고 학습.

이 항목 아이디어 :

중반이 좋은 정렬 순서, 최소 거리 ≥mid을 찾을 수있는 순서 : 1, 나는 절반의 절반을 모르는 말을하지 않습니다이 문제는,이 이분법은 궁극적 인 이분법 ANS는 다음 의미를 부여하고있다

2. 그래서 우리는 수표를 작성해야합니다, 아이디어는 충분히에 대한 욕심, 직접 액세스 할 수 있습니다.

3.이 주제를 들어, 중반을의 메모를 만들기 위해주의해야합니다 :

1 개 중간 왼쪽 = + (오른쪽 왼쪽) / 2 중간 이상은 = (오른쪽 + 왼쪽) / 2 , 특히 INT 터뜨려 왼쪽 위험 오른쪽 + 때문에 더이다
. (좌우 + 1) 2 MID = 왼쪽 +가 / 부분 2 오른쪽, 왼쪽에 해당하는 오른쪽도 왼쪽이 아닌 오른쪽 반대를 선호한다. 그렇지 않으면, 상황이 나타납니다 Kichiku (34)는 24 또는 35이된다

강령

( 내가 주석 일부 Kichiku 잘못된 xjb 구제 있으며,이 내 진짜 수준 ) :

//  code block
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <climits>
#include <queue>
#define ULL unsigned long long
using namespace std;
bool check(int k);
int all[100010];
int N,C;
//int ans_MIN;
int main()
{
	scanf("%d %d",&N,&C);
	for(int time=0;time<N;time++)
	{
		scanf("%d",&all[time]);
	}
	sort(all,all+N);
	int left=0,right=all[N-1]-all[0]+1;
	//ans_MIN=left;
	while(left+1<right)
	{
		/*
		if(right-left==1)
		{
			if(check(left))ans_MIN=left;
			if(check(right))ans_MIN=right;
		}
		*/
		int mid=(right+left)/2;
		if(check(mid))
		{
			//ans_MIN=mid;
			left=mid;
		}
		else right=mid;
	}
	printf("%d\n",left);


    return 0;
}
bool check(int k)
{
	int num=C-1;
	int location=0;
	int last=0;
	while(++location)
	{
		if(num==0)return 1;
		else if(location==N)return 0;
		else if(all[location]-all[last]>=k){last=location;num--;}
	}

}

출시 팔 개 원래 기사 · 원의 칭찬 0 · 조회수 119

추천

출처blog.csdn.net/DevourPower/article/details/103950421