1020 月餅 (25 分)
問題描述:
就是從不同種類的月餅中,選出d重量的月餅,使得收益最大。允許某種月餅可以只取一部分。
解題思路:
先將每種月餅的單價計算出來,然後按照從大到小順序排序,然後根據d需求量選擇月餅。某種月餅不足d,就將此種月餅全部銷售,d在減去此種月餅重量,最後如果一種月餅只要一部分就可以滿足d,就用這一部分乘以單價就可以了。
但是我這個不知道怎麼有個點通不過,答案錯誤,很奇怪。也不知道**有問題。
**:
#include #include using namespace std;
typedef struct mooncake
mooncake;
bool cmp(mooncake a, mooncake b);
int main()
for(int i = 0; i < n; i++)
sort(cake, cake + n, cmp);
int i = 0;
while(d)
else
}printf("%.2f", result);
delete cake;
return 0;
}bool cmp(mooncake a, mooncake b)
1023 組個最小數 (20 分)
問題描述:
給定數字 0-9 各若干個。你可以以任意順序排列這些數字,但必須全部使用。目標是使得最後得到的數盡可能小(注意 0 不能做首位)。例如:給定兩個 0,兩個 1,三個 5,乙個 8,我們得到的最小的數就是 10015558。
解題思路:
定義乙個10個長度的int陣列,記錄每個數字的個數。然後判斷0有幾個,如果有0就先從1-9裡面看最小的是誰,先輸出它一次,然後將其個數減一,最後在按照0-9的順序,看每個數有多少個,就輸出多少個就是。
**:
#include int numcounts[10] = ;
void printallnums();
int main()
int i = 1;
while(!numcounts[i++]);
numcounts[i - 1]--;
printf("%d", i - 1);
printallnums();
return 0;
}void printallnums()
}}
區間貪心
問題描述:
區間不相交問題:給出n個開區間(x,y),從中選擇盡可能多的開區間,使得這些區間兩兩沒有交集。
解題思路:
將這些區間按照x的降序,y的公升序排列。然後從第乙個區間開始,記錄他的x為lastx,判斷下乙個的區間的y是否大於lastx,大於就說明有交集。當遇到乙個y小於lastx的區間是,這個區間不與前乙個區間相交,可以選中,同時將lastx更新為此區間的x值,然後繼續下乙個區間的判斷。
#include #include using namespace std;
typedef struct inteval
interval;
bool cmp(const inteval& a, const inteval& b)
else//x相同時,y降序 }
int main()
sort(i, i + n, cmp);
int result = 1;
int lastx = i[0].x;//第一次lastx 為第乙個區間的x
for(int i = 1; i < n; i++)
}printf("%d\n", result);
} return 0;
}
PAT乙級 插入與歸併
根據維基百科的定義 插入排序是迭代演算法,逐一獲得輸入資料,逐步產生有序的輸出序列。每步迭代中,演算法從輸入序列中取出一元素,將之插入有序序列中正確的位置。如此迭代直到全部元素有序。歸併排序進行如下迭代操作 首先將原始序列看成 n 個只包含 1 個元素的有序子串行,然後每次迭代歸併兩個相鄰的有序子串...
PAT 乙級 1035 插入與歸併
1.題目描述 根據維基百科的定義 插入排序是迭代演算法,逐一獲得輸入資料,逐步產生有序的輸出序列。每步迭代中,演算法從輸入序列中取出一元素,將之插入有序序列中正確的位置。如此迭代直到全部元素有序。歸併排序進行如下迭代操作 首先將原始序列看成n個只包含1個元素的有序子串行,然後每次迭代歸併兩個相鄰的有...
PAT乙級 1035 插入與歸併
根據維基百科的定義 插入排序是迭代演算法,逐一獲得輸入資料,逐步產生有序的輸出序列。每步迭代中,演算法從輸入序列中取出一元素,將之插入有序序列中正確的位置。如此迭代直到全部元素有序。歸併排序進行如下迭代操作 首先將原始序列看成 n 個只包含 1 個元素的有序子串行,然後每次迭代歸併兩個相鄰的有序子串...