贪心算法之——过河问题(nyoj47)
生活随笔
收集整理的這篇文章主要介紹了
贪心算法之——过河问题(nyoj47)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
問(wèn)題:
過(guò)河問(wèn)題
時(shí)間限制:1000?ms ?|? 內(nèi)存限制:65535?KB 難度:5 描述在漆黑的夜里,N位旅行者來(lái)到了一座狹窄而且沒有護(hù)欄的橋邊。如果不借助手電筒的話,大家是無(wú)論如何也不敢過(guò)橋去的。不幸的是,N個(gè)人一共只帶了一只手電筒,而橋窄得只夠讓兩個(gè)人同時(shí)過(guò)。如果各自單獨(dú)過(guò)橋的話,N人所需要的時(shí)間已知;而如果兩人同時(shí)過(guò)橋,所需要的時(shí)間就是走得比較慢的那個(gè)人單獨(dú)行動(dòng)時(shí)所需的時(shí)間。問(wèn)題是,如何設(shè)計(jì)一個(gè)方案,讓這N人盡快過(guò)橋。?
輸入每組測(cè)試數(shù)據(jù)的第一行是一個(gè)整數(shù)N(1<=N<=1000)表示共有N個(gè)人要過(guò)河
每組測(cè)試數(shù)據(jù)的第二行是N個(gè)整數(shù)Si,表示此人過(guò)河所需要花時(shí)間。(0<Si<=100)
分析:
當(dāng)只有一個(gè)人時(shí):時(shí)間s=a[0];
當(dāng)人數(shù)為二:時(shí)間s=a[1];
當(dāng)人數(shù)為三:時(shí)間s=a[0]+a[1]+a[2];
當(dāng)人數(shù)為四:時(shí)間s=a[0]+a[2]>2*a[1] ? a[0]+3*a[1]+a[3] : 2*a[0]+a[1]+a[2]+a[3];(如:一:1,2,5,10;二:1,7,8,10)
我的代碼:
#include <stdio.h> #include <algorithm> using namespace std; int main() {int t;scanf("%d", &t);while(t--){int n, a[1005]={0};scanf("%d", &n);for(int i=0; i<n; i++){scanf("%d", &a[i]);}sort(a, a+n);if(n==1) printf("%d\n", a[0]);else if(n==2) printf("%d\n", a[1]);else if(n==3) printf("%d\n", a[0]+a[1]+a[2]);else if(n==4) printf("%d\n", 2*a[1]<a[0]+a[2] ? a[0]+3*a[1]+a[3] : 2*a[0]+a[1]+a[2]+a[3]);else {int s=0;for(int i=n-1; i>1; i-=2){if(i-1==2)//只剩4個(gè)人,所有人都過(guò)去{s += 2*a[1]<a[0]+a[i-1] ? a[0]+3*a[1]+a[i] : 2*a[0]+a[1]+a[i-1]+a[i];break;}if(i-1==1)//只剩3個(gè)人,所有人都過(guò)去{s += a[0]+a[1]+a[i];break;}/*此時(shí)剩余人數(shù)大于4,只需要通過(guò)最快的兩個(gè)人(或一個(gè)人)把最后兩個(gè)人送到對(duì)岸,然后自己返回接剩下的人*/ s += 2*a[1]<a[0]+a[i-1] ? a[0]+2*a[1]+a[i] : 2*a[0]+a[i-1]+a[i];}printf("%d\n", s);}}return 0; }與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖
總結(jié)
以上是生活随笔為你收集整理的贪心算法之——过河问题(nyoj47)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: vue-cli3 编译打包文件的压缩优化
- 下一篇: IDEA 自动生成类注释和方法注释