生活随笔
收集整理的這篇文章主要介紹了
PAT 1044
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1、1044 Shopping in Mars
2、題目分析
- (1)題意:給出一串鉆石的數(shù)量,以及每顆鉆石的價錢。求出在給出需要付出的錢數(shù)的情況下,找出可有使用鉆石支付并且最小浪費的情況,如果有多種并列,則按照鉆石數(shù)的序號從小到大輸出。題目保證一定有解。
- (2)分析:題目意思即是,找出一個連續(xù)的子序列,滿足該連續(xù)子序列的和等于給出的數(shù)字M。
- (3)我們可以想,將這個序列,所有的和依次加起來,這樣的話,就可以得到一個遞增的序列,那么我們就可以對這個遞增序列下手了??梢杂^察到,我們需要依次從i = 0--->i =n遍歷,找出其中滿足條件的子序列,于是我們可以使用二分法,從i到n依次尋找滿足條件的i值。
- (4)與此同時,我們需要考慮一種特殊情況,就是這些連續(xù)的子序列沒有恰好符合條件的值,即沒有剛好等于需要支付的錢數(shù)鉆石,那么這個時候,我們就需要再次遍歷一次,找出最小差值的連續(xù)子序列。
3、源代碼
#include <stdio.h>
#define size 100002int main(){int n,m;//n表示的是鉆石數(shù),m表示的是需要負(fù)的價錢 int diamond[size];//表示一個鏈上的鉆石數(shù) int sum[size];sum[0] = 0;//初始化第一項為0 scanf("%d %d",&n,&m); int i ;for(i = 0;i<n;i++){scanf("%d",&diamond[i]);sum[i+1] = sum[i] + diamond[i]; }//開始遍歷尋找價格剛好為m的鏈 int count = 0;//用來表示是否存在有恰好相等的數(shù)字int min = m;//用來表示兩者金額差for(i = 1 ; i <= n ; i++){int left = i,right = n;//左右邊界 int mid;while(left <= right){//注意循環(huán)邊界 mid = (left + right) / 2;//求出中間值if(sum[mid] < sum[i-1] + m) {//如果小于 left = mid + 1;//左邊界值就等于中間值加1 }else if(sum[mid] > sum[i-1] + m){//如果大于 right = mid - 1;//右邊界值就等于中間值減1if(min > sum[mid] -( sum[i-1] + m )){min = sum[mid] -( sum[i-1] + m ); } }else{//兩者相等 printf("%d-%d\n",i,mid); //輸出i,mid值 min = 0; break; } }}//如果說沒有找到恰好相等的金額,那么就找出相對比較小的 if(min != 0){//printf("min = %d\n",min);for(i = 1 ; i <= n ; i++){int left = i,right = n;//左右邊界 int mid;while(left <= right){//注意循環(huán)邊界 mid = (left + right) / 2;//求出中間值if(sum[mid] < sum[i-1] + m) {//如果中間值小于的話 left = mid + 1;//左邊界值就等于中間值加1}else if(sum[mid] > sum[i-1] + m){//如果中間值大于的話 right = mid - 1;//右邊界值就等于中間值減1 //如果說剛好差值為 min if(min == sum[mid] -( sum[i-1] + m )){printf("%d-%d\n",i,mid); //輸出i,mid值 }}}}}
}
/**
16 15
3 2 1 5 4 6 8 7 16 10 15 11 9 12 14 138 15
3 2 1 5 4 6 8 75 13
2 4 5 7 93 3
1 2 33 5
2 2 21 10
18
**/
5、總結(jié)
在使用二分法的時候,需要注意的是:
- (1)當(dāng)使用二分法的時候,如果是left = mid + 1 ; right ?= mid - 1;則循環(huán)結(jié)束條件是while(left <= right) {}
- (2) 需要注意當(dāng)找到滿足條件的值的時候,需要跳出while循環(huán)體,則使用break即可。
?
總結(jié)
以上是生活随笔為你收集整理的PAT 1044的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。