入门-贪心算法
入門-貪心算法
- 1. 看電視
- 解析
- 題目鏈接 [看電視](http://acm.zzu.edu.cn/problem.php?id=1160)
- 代碼
- 2. 出租車費
- 題目鏈接 [出租車費](http://acm.zzu.edu.cn/problem.php?id=1161)
- 代碼
- 3. 迷障
- 題目鏈接 [迷障](http://acm.zzu.edu.cn/problem.php?id=1196)
- 解析
- 代碼
- 4. 均分紙牌
- 題目鏈接 [均分紙牌](http://acm.zzu.edu.cn/problem.php?id=1225)
- 代碼
- 5. 糖果峽谷
- 題目鏈接 [糖果峽谷](http://acm.zzu.edu.cn/problem.php?id=1248)
- 代碼
1. 看電視
題目描述
暑假到了,小明終于可以開心的看電視了。但是小明喜歡的節目太多了,他希望盡量多的看到完整的節目。
現在他把他喜歡的電視節目的轉播時間表給你,你能幫他合理安排嗎?
輸入
輸入包含多組測試數據。每組輸入的第一行是一個整數n(n<=100),表示小明喜歡的節目的總數。
接下來n行,每行輸入兩個整數si和ei(1<=i<=n),表示第i個節目的開始和結束時間,為了簡化問題,每個時間都用一個正整數表示。
當n=0時,輸入結束。
輸出
對于每組輸入,輸出能完整看到的電視節目的個數。
樣例輸入
12
1 3
3 4
0 7
3 8
15 19
15 20
10 15
8 18
6 12
5 10
4 14
2 9
0
樣例輸出
5
解析
區間問題,像覆蓋盡量多的區間,則按區間右端點排序。
題目鏈接 看電視
代碼
#include <cstdio> #include <iostream> #include <algorithm>using namespace std;typedef struct TVShow{int s, e; }TV;bool cmp(TV tv1, TV tv2){if (tv1.e == tv2.e) return tv1.s < tv2.s;return tv1.e < tv2.e; }TV tv[105]; int main(){int n;while(scanf("%d", &n) && n != 0){for (int i=0; i<n; ++i){cin>>tv[i].s>>tv[i].e;}sort(tv, tv+n, cmp);int cnt = 0, pre = 0;for (int i=0; i<n; i++){if (tv[i].s >= pre){++cnt;pre = tv[i].e;}}cout<<cnt<<endl;}return 0; }2. 出租車費
題目描述
某市出租車計價規則如下:起步4公里10元,即使你的行程沒超過4公里;接下來的4公里,每公里2元;之后每公里2.4元。行程的最后一段即使不到1公里,也當作1公里計費。
一個乘客可以根據行程公里數合理安排坐車方式來使自己的打車費最小。
例如,整個行程為16公里,乘客應該將行程分成長度相同的兩部分,每部分花費18元,總共花費36元。如果坐出租車一次走完全程要花費37.2元。
現在給你整個行程的公里數,請你計算坐出租車的最小花費。
輸入
輸入包含多組測試數據。每組輸入一個正整數n(n<10000000),表示整個行程的公里數。
當n=0時,輸入結束。
輸出
對于每組輸入,輸出最小花費。如果需要的話,保留一位小數。
樣例輸入
3
9
16
0
樣例輸出
10
20.4
36
題目鏈接 出租車費
代碼
#include <iostream> #include <cstdio> using namespace std; const int nmax=10000000+10; const double eps=1e-6;int main() {int n;while(1){cin>>n;if(n==0){break;}double sum=0;if(n<=4){sum=10;}else if(n>=4 && n<=8){sum=10+(n-4)*2;}else if(n>=8){sum += 18 * (n/8);n = n % 8;if(n<=4){sum+=2.4*n;}else{sum+=10+(n-4)*2;}}int tmp=(int)sum;if(sum-tmp<eps) printf("%d\n",tmp);else printf("%.1lf\n",sum);}return 0; }3. 迷障
題目描述
小明正在玩游戲,他控制的角色正
面臨著幽谷的考驗——
幽谷周圍瘴氣彌漫,靜的可怕,隱約可見地上堆滿了骷髏。由于此處長年不見天日,導致空氣中布滿了毒素,一旦吸入體內,便會全身潰爛而死。
幸好小明早有防備,提前備好了解藥材料(各種濃度的萬能藥水)。現在只需按照配置成不同比例的濃度。
現已知小明隨身攜帶有n種濃度的萬能藥水,體積V都相同,濃度則分別為Pi%。并且知道,針對當時幽谷的瘴氣情況,只需選擇部分或者全部的萬能藥水,然后配置出濃度不大于 W%的藥水即可解毒。
現在的問題是:如何配置此藥,能得到最大體積的當前可用的解藥呢?
特別說明:由于幽谷內設備的限制,只允許把一種已有的藥全部混入另一種之中(即:不能出現對一種藥只取它的一部分這樣的操作)。
輸入
輸入數據的第一行是一個整數C,表示測試數據的組數;
每組測試數據包含2行,首先一行給出三個正整數n,V,W(1<=n,V,W<=100);
接著一行是n個整數,表示n種藥水的濃度Pi%(1<=Pi<=100)。
輸出
對于每組測試數據,請輸出一個整數和一個浮點數;
其中整數表示解藥的最大體積,浮點數表示解藥的濃度(四舍五入保留2位小數);
如果不能配出滿足要求的的解藥,則請輸出0 0.00。
樣例輸入
2
1 35 68
1
2 79 25
59 63
樣例輸出
35 0.01
0 0.00
題目鏈接 迷障
解析
排序,先加濃度低的,直到濃度超過w
代碼
#include <cstdio> #include <iostream> #include <algorithm>using namespace std;int main(){int C;cin>>C;while(C--){int n, v;int w, M[105];cin>>n>>v>>w;for (int k=0; k<n; ++k){cin>>M[k];}sort(M, M+n);int total = 0;double p = 0;int k;for (k=0; k<n; ++k){if ((total+M[k]) / (double)(k+1) > (double)w){break;}total += M[k];p = total / (double)(k+1);}printf("%d %.2f\n", k*v, p/100.0);}return 0; }4. 均分紙牌
題目描述
有 N 堆紙牌,編號分別為 1,2,…, N。每堆上有若干張,但紙牌總數必為 N 的倍數。可以在任一堆上取若于張紙牌,然后移動。
??移牌規則為:在編號為 1 堆上取的紙牌,只能移到編號為 2 的堆上;在編號為 N 的堆上取的紙牌,只能移到編號為 N-1 的堆上;其他堆上取的紙牌,可以移到相鄰左邊或右邊的堆上。
??現在要求找出一種移動方法,用最少的移動次數使每堆上紙牌數都一樣多。
??例如 N=4,4 堆紙牌數分別為:
??①?9?②?8?③?17?④?6
??移動3次可達到目的:
??從 ③ 取 4 張牌放到 ④ (9 8 13 10) -> 從 ③ 取 3 張牌放到 ②(9 11 10 10)-> 從 ② 取 1 張牌放到①(10 10 10 10)。
輸入
鍵盤輸入文件名。文件格式:
??N(N 堆紙牌,1 <= N <= 100)
??A1 A2 … An (N 堆紙牌,每堆紙牌初始數,l<= Ai <=10000)
輸出
輸出至屏幕。格式為:
??所有堆均達到相等時的最少移動次數。‘
樣例輸入
4
9 8 17 6
樣例輸出
3
題目鏈接 均分紙牌
代碼
#include<iostream> using namespace std; int main() {int a[100],N,i,s=0,c=0;cin>>N;for(i=0;i<N;i++) {cin>>a[i];s=s+a[i];}int ave=s/N;for(i=0;i<N;i++)a[i]=a[i]-ave;for(i=0;i<N;i++){if(a[i]==0) continue;else{ a[i+1]=a[i+1]+a[i];c++;}}cout<<c; }5. 糖果峽谷
題目描述
吃到到前面的糖果以后,小Y充滿了能量,繼續向前走,眼睛癡癡的望著那遙遠的糖果雨。
走啊,走啊,走啊走~~~
小Y又累了,不過它的精神已經打動了糖人。
一陣風飄過,糖人又出現在小Y的面前。小Y頓時兩眼放光,想從糖人那里騙到一些糖果,來堵住口水,順便補充能量。糖人微微一笑,說道:“別妄想了,我這個世界同在,如果你打我的注意,你將永遠也到不了那有糖果雨的地方!”為了更多的糖果,小Y立刻冷靜下來,裝出一副“我才不會打你的注意”的樣子。
糖人見小Y已經平靜下來。于是,一揮手,眼前景象大變。小Y揉了揉眼睛,有些不敢相信自己的眼睛,不過,這確實是真的!!
小Y現在在一個峽谷里[一線天]前,峽谷有N個糖果單位,時刻都在向下飄落著糖果,不過由于沒有人來,糖果到地面就會消失,小Y一陣心痛。
糖人從手中拿出一個巨大的容器交個小Y,并告訴他,在糖果峽谷中神秘力量的推動下,他每分鐘前進1個糖果單位。糖人給小Y的容器有C個格子,每個格子只可以裝1個糖果。
糖果峽谷里一共有K種糖果,每種糖果有Mi個,第i種會在峽谷中離入口Si(0<Si<=N)個糖果單位出現,可以選擇用容器接或不接,接住的數量是任意的,當然不能超過Mi個;如果接住以后,會在Ti分鐘(Ti>0,Si+Ti<N)后真正屬于小Y [接住時那一分鐘也計算在內,即在走到Si+Ti-1個單位后,糖果會屬于小Y],糖果屬于小Y以后就不會再占用容器的空間了。
小Y此時已經被糖果沖昏了頭腦,只想得到最多的糖果。所以,他向你求助,你要想辦法,讓小Y接住最多的糖果。
輸入
第一行,三個整數K,N,C
接下來K行,每行三個數,Si,Ti,Mi
輸出
輸出僅一行,最大的糖果數
樣例輸入
4 16 3
1 3 2
2 7 3
4 4 1
9 6 2
樣例輸出
6
題目鏈接 糖果峽谷
代碼
沒通過
總結
- 上一篇: 阿里专家晨末:什么是技术一号位?
- 下一篇: 高可用:异地多活