oj- 木棍問題

題目如圖所示:

爲了避免處理小數誤差,將數據*100處理,二分查找找到測試長度,然後直到二分區間左右端點相鄰,再測試哪個端點滿足要求,最後換成保留2位小數處理。

如下:

//
//  testb.c
//  testB
//
//  Created by ke tang on 2018/9/19.
//  Copyright © 2018年 ke tang. All rights reserved.
//

#include <stdio.h>
#include "stdlib.h"


int numvalid (float,int,int,int*);

int numvalid (float mid,int n,int m,int* array)//測試當前測試長度是否可以滿足截取數量的要求
{
    int numof = 0;
    for(int i=0;i<n;i++)
    {
        numof+=*array/mid;
        array = array + 1;
    }//numof表示可以截出的小木棍數量
    if (numof >= m )
    {
        return 1;//表示當前測試長度可行,但也許有更長的測試長度能通過
    }
    else  //測試長度過長
    {
        return 0 ;
    }
}

int main()
{
    int n,m;//n=給定木棍數量,m=要截出的小木棍長度
    int i;
    int *array;
    int min;
    
    printf("input n and m\n");
    scanf("%d%d",&n,&m);
    
    array = (int*)malloc(n*sizeof(int));
    printf("input each length of stick\n");
    for(i=0;i<n;i++)
    {
        scanf("%d",&array[i]);
        array[i]=100*array[i];
    }//存入數組
    min=array[0];//n根木棍中的最小值
    for (i=1;i<n;i++)
    {
        if (min>array[i])
            min=array[i];
    }//取得最小值
    
    //initial
    int minlength = 0;//二分查找區間的左端
    int maxlength = min;//二分查找區間的右端
    int mid = min ;
    int ans,ansleft,ansright;
    
    while (minlength+1<maxlength)//二分查找區間左右端點相鄰時停止
    {
        mid= (minlength+maxlength)/2;
        ans =numvalid(mid,n,m,&array[0]);
        if(ans==0)
        {
            maxlength = mid;
        }
        else if (ans == 1)
        {
            minlength= mid;
        }
    }
    
    //最後判斷二分區間的哪個端點滿足數量條件
    ansleft = numvalid(minlength, n, m, &array[0]);
    ansright = numvalid(maxlength, n, m, &array[0]);
        
        
        if (ansright == 1&&ansleft==1)//兩端均滿足時,取大
        {
            printf("%.2f\n",((float)maxlength/100));
            free(array);
        }
        else if (ansleft==1&&ansright!=1)
        {
            printf("%.2f\n",((float)minlength/100));
            free(array);
        }
        else if (ansleft!=1&&ansright==1)
        {
            printf("%.2f\n",((float)maxlength/100));
            free(array);
        }
    
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章