Home+Work (華為入職前練習)
阿新 • • 發佈:2019-02-10
題目描述
臨近開學了,小C才想起來數學老師佈置了暑假作業。暑假作業是很多張試卷,每張試卷所需的時間和獲取的價值已知,請你幫他安排一下,用他僅剩的一點時間來做最有價值的作業。
介面說明
原型:
int GetMaxValue(int nPapers, int nRemain, int paper[][2], double* pMaxValue)
輸入引數:
int nPapers:試卷的數目(1≤Papers≤20)
int nRemain:表示剩餘的時間(1≤nRemain≤10000)
int paper[][2]:nPapers*2的陣列,每一行的兩個元素依次為做完這一份試卷所需的時間、做完這份試卷獲取的價值。如果剩餘時間不夠做完一份卷子,可根據剩餘時間獲得卷子的部分價值。
輸出引數:
double * pMaxValue:獲得的最大價值
返回值:
0:異常,1:成功
#include "stdafx.h" #include "iostream" #include "string" using namespace std; /* 輸入: nPapers表示試卷的數目(1≤Papers≤20),nRemain表示剩餘的時間(1≤nRemain≤10000),paper[][2]是一個Papers*2的陣列, 每一行的兩個元素依次為做完這一份試卷所需的時間、做完這份試卷的價值 輸出: *pMaxValue為獲得的最大價值 返回: 0:異常 1:計算成功返回 */ int GetMaxValue(int nPapers, int nRemain, int paper[][2], double* pMaxValue) { if (nPapers<0 || nPapers>200 || nRemain<0 || nRemain>10000) { return 0; } *pMaxValue=0; int i,index,timesum=0,timesumMax=0; double temp[20]={0}; for (i=0;i<nPapers;i++) { temp[i]=(double)paper[i][1]/(double)paper[i][0]; timesumMax+=paper[i][0]; } do { double f=0; for (i=0;i<nPapers;i++) { if (f<temp[i]) { f=temp[i]; index=i; } } temp[index]=0; timesum+=paper[index][0]; if (timesum<nRemain) { *pMaxValue+=paper[index][1]; } else { double t=(double)paper[index][1]*(nRemain-timesum+paper[index][0])/(double)paper[index][0]; *pMaxValue+=t; } } while (timesum<nRemain && timesum<timesumMax); return 1; } int main() { while(true){int paper[5][2]={{4,20},{4,10},{5,22},{10,3},{1,2}}; double a=0; double* pMaxValue=&a; int n; cin>>n; GetMaxValue(5, n, paper, pMaxValue); cout<<*pMaxValue<<endl;} return 0; }