日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nyoj 47

發布時間:2025/3/16 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nyoj 47 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:http://acm.nyist.net/JudgeOnline/problem.php?pid=47

分析:

如果n==1或者n==2,所有人直接過河即可;

如果n==3,用時最短的和用時最長的一起過去,然后用時最短的回來,再和剩下的一個人過去 ;

如果n>=4,設a[0]表示用時最短的人所用的時間,a[1]為用時第二短的人所用的時間,a[n-1]表示用時最長的人所用的時間,a[n-2]表示用時第二長的人所用的時間。那么:

當2a[1] + a[0] + a[n-1] > 2a[0] + a[n-1] + a[n-2]時,就先讓用時最短的人和用時最長的人一起過去,然后用時最短的回來,接著讓用時最短的和用時第二長的一起過去,再讓用時最短的回來。

否則,就先讓用時最短的和用時第二短的一起過去,然后用時最短的回來,接著讓用時最長和用時第二長的一起過去,再讓用時第二短的回來。這樣就相當于剩下了n-2個人。對這n-2個人執行相同的操作,知道剩下不足4個人即可。


#include<stdio.h> #include<algorithm> using namespace std; int a[1005]; int main() {int T, n, i;scanf("%d",&T);while(T--){scanf("%d",&n);for(i = 0; i < n; i++)scanf("%d",&a[i]);sort(a,a+n);int sum = 0;while(n >= 4){if((a[1] * 2 + a[n-1] + a[0]) > (2 * a[0] + a[n-1] + a[n-2])){ //求出最長的兩個人過橋所用的最短時間sum += a[n-1]; //用時最短的和用時最長的一起過去sum += a[0]; //用時最短的回來sum += a[n-2]; //用時最短的和用時第二長的一起過去sum += a[0]; //用時最短的回來}else{sum += a[1]; //最短的和第二短的一起過去sum += a[0]; //最短的回來sum += a[n-1]; //最長的和第二長的一起過去sum += a[1]; //第二短的回來}n -= 2;}if(n == 3)sum += a[1] + a[0] + a[2];else if(n == 2)sum += a[1];elsesum += a[0];printf("%d\n",sum);}return 0; }

總結

以上是生活随笔為你收集整理的nyoj 47的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。