真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

P2678[NOIP2015提高組]跳石頭題解-創(chuàng)新互聯(lián)

用于個(gè)人學(xué)習(xí)記錄

成都創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站制作、成都網(wǎng)站建設(shè)與策劃設(shè)計(jì),固始網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:固始等地區(qū)。固始做網(wǎng)站價(jià)格咨詢:13518219792

一、題目描述

二、方法介紹?

? 二分查找——在有序數(shù)組中折半查找所需值(默認(rèn)數(shù)組升序)

  • 初始將整個(gè)數(shù)組作為查找區(qū)域? 記數(shù)組最左側(cè)下標(biāo)為 left? 數(shù)組最右側(cè)下標(biāo)為 right? 查找區(qū)域[left, right]
  • 將查找區(qū)域的中間值與所需值進(jìn)行比較,若大于所需值,則此時(shí)右半側(cè)區(qū)間內(nèi)的值均大于所需值(數(shù)組升序排列從左到右數(shù)字大小依次增大),舍棄右側(cè)區(qū)間,在左側(cè)區(qū)間內(nèi)繼續(xù)查找。若小于所需值,則此時(shí)左半側(cè)區(qū)間內(nèi)的值均小于所需值,舍棄左區(qū)間,在右側(cè)區(qū)間繼續(xù)查找。
  • 直至此時(shí)的中間值等于所需值,則輸出?;蛞呀?jīng)沒有可以繼續(xù)查找的區(qū)間但仍未找到所需值。

代碼實(shí)現(xiàn)

#includeint main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//數(shù)組需為有序數(shù)組
	int k = 7;//k為所需值
	int sz = sizeof(arr) / sizeof(arr[0]);//數(shù)組總大小/每個(gè)數(shù)的大小=數(shù)的個(gè)數(shù)
	int left = 0;
	int right = sz - 1;//想知道right的值必須先知道數(shù)組中數(shù)的個(gè)數(shù)
	while (left<= right)//當(dāng)left >right則表明已沒有可繼續(xù)查找的區(qū)間
	{//通過比較區(qū)間中間數(shù)與k的大小一步步縮短區(qū)間最終找到k
		//int mid = (right + left) / 2;//這種方法求mid有弊端,如果left + right超出int的范圍則會(huì)影響mid的值
        int mid = left + (right - left) / 2;
		if (arr[mid] >k) {
			right = mid - 1;//舍棄右側(cè)區(qū)間
		}
		else if (arr[mid]< k) {
			left = mid + 1;//舍棄左側(cè)區(qū)間
		}
		else if (arr[mid] == k){
			printf("下標(biāo)為:%d", mid);//此時(shí)返回的為數(shù)在數(shù)組中的下標(biāo)
			break;//找到所需值時(shí)即可終止
		}
	}
	if (left >right)
	{
		printf("false");//代表未能在數(shù)組中找到所需值
	}
	return 0;
}

三、題解

  • 題意分析

最短跳躍距離的大值(說實(shí)話我一開始半天沒讀懂,語文不好真的會(huì)對(duì)題目這種說法疑惑,不過可能只有我沒看懂)

以題目樣例為例

? 一開始的石頭分別位于2 11 14 17 21

? 則相鄰兩塊石頭的距離分別為 2,9,3,3,4,4(包括第一塊與起始位置的距離,最后一塊與終點(diǎn)的距離)此時(shí)最短跳躍距離為2

? 移去距離為2和14的兩塊石頭后,相鄰兩塊石頭間距離分別為11,6,4,4則最短跳躍距離為4

假設(shè)移走的為距離為2和17的,那么相鄰兩塊石頭間距離分別為11,3,7,4則最短跳躍距離為3,小于4。同樣可以假設(shè)移走另外兩塊石頭,會(huì)發(fā)現(xiàn)得出的最短跳躍距離均小于4,所以4為最短跳躍距離的大值。

  • 真正的題解

拋開一切其他條件時(shí)最短跳躍距離大可為起始點(diǎn)與終點(diǎn)距離(總距離)的一半,所以可將總距離視為一個(gè)升序數(shù)組,從一到總距離均為可能的解的值,用二分法查找符合條件的大的解能為多少,判斷條件即為要使最短跳躍距離為這個(gè)值,需要移走的石頭數(shù)量是否符合條件。

代碼實(shí)現(xiàn)

#define _CRT_SECURE_NO_WARNINGS
#includeint L = 0, N = 0, M = 0;//起點(diǎn)和終點(diǎn)的距離(總距離),巖石數(shù)量,移走的巖石的數(shù)量
int n[50002] = { 0 };//記錄每塊石頭與起點(diǎn)的距離

int judge(int x) {//判斷此時(shí)的解是否符合要求(搬走的石頭的數(shù)量不超過M)
	int count = 0;//記錄在最短距離為x的情況下需要搬走的石頭的數(shù)量
	int now = 0, to = 1;//現(xiàn)在的位置和要去的位置
	while (to<= N + 1) {//最后一塊石頭跳到終點(diǎn)的距離也要判斷
		if (n[to] - n[now]< x) {//此時(shí)這兩塊石頭之間的距離沒有達(dá)到假設(shè)的最小距離
			count++;//搬走這塊石頭使此時(shí)所在石頭與下一塊石頭之間的距離增大
		}
		else {//此時(shí)所在石頭與下一塊石頭間的距離符合假設(shè)的值不需要搬走石頭,直接跳過去,所以更新此時(shí)所在的位置
			now = to;
		}
		to++;
	}
	if (count >M)
		return 0;
	else
		return 1;
}
//主函數(shù)
int main()
{
	scanf("%d %d %d", &L, &N, &M);
	n[0] = 0, n[N + 1] = L;//記錄起始點(diǎn)和終點(diǎn)
	for (int i = 1; i<= N; i++) {
		scanf("%d", &n[i]);
	}
	int left = 0, right = L;//從大的可能開始逐個(gè)排除(一步登天)
	int mlen = 0;//記錄結(jié)果
	while (left<= right) {
		int mid = (left + right) / 2;
		if (judge(mid) == 1) {//如果此時(shí)的mid符合要求(一般都不會(huì)是大值<是大好像也不影響>,所以要判斷是否有更大的可行值)
			mlen = mid;//先記錄一下此時(shí)的答案
			left = mid + 1;//判斷是否有更大的可行值
		}
		else {//最小距離的大值不能達(dá)到mid,減小這個(gè)值
			right = mid - 1;
		}
	}
	printf("%d", mlen);
	return 0;
}

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧


網(wǎng)站題目:P2678[NOIP2015提高組]跳石頭題解-創(chuàng)新互聯(lián)
本文路徑:http://weahome.cn/article/jjcgi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部