NOJ1587 &&小学奥数题 多人过桥问题

来源:互联网 发布:ppt数据分析图表对比 编辑:程序博客网 时间:2024/05/01 22:45

2014/7/20


      我是菜比系列


               打不过小学生。


链接:http://acm.nbut.edu.cn/Problem/view.xhtml?id=1587

题意: 晚上有N个人要过桥他们只有1个手电筒,而且那座桥一次只能容纳两个人同时过去,超过两个人的话,桥就会塌了。

而且每个人过桥所用的时间也不相同。如果没有手电筒,摸着黑去过桥也会不小心掉下去的。所以快的那个人要等着慢的那个人,而且当两个人拿着手电筒到桥的另一端时,那边的人必须要有一个人拿着手电筒回来。求所有人过完桥用时间最短。。。

记得当初小学的时候就给了一组数据,然后我们在那边猜最少的时间。

现在丧心病狂的hungar竟然出成题目来虐我了....这就算我是彩笔也不能忍。所以果断和这道题同归于尽了。。

#include<stdio.h>#include<string.h>#include<cmath> #include<algorithm>#include<iostream>#include<queue>#include<stack>#include<map>#include<climits>#include<vector>using namespace std;#define f(x,y,i) for(int i = x;i < y; i++)#define F(x,y,i) for(int i = x; i <= y; i++)#define lson pos<<1,l,mid#define rson pos<<1|1,mid+1,r#define sc(n) scanf("%d",&n)#define pr(n) printf("%d\n",n)#define met(n,m) memset(n, m, sizeof(n)) const int N=1050;int s[N];int main(){    int n ;    while(~scanf("%d",&n))    {        f(0,n,i)sc(s[i]);    sort(s,s+n);    int sum = 0;    int temp =0 ;    int cnt=0;    if(n==1)sum=s[0];    else if(n%2==0)    {    sum+=s[1];    for(int i= n-1; i> 1;i-=2)    {    if(2*s[0]+s[i]+s[i-1] >s[0]+2*s[1] +s[i])    {    //printf("%d\n",s[0]+2*s[1] +s[i]);    sum+=s[0]+2*s[1] +s[i];    }    else sum+=2*s[0]+s[i]+s[i-1];        } }    else    {    sum+=s[1];    for(int i= n-1; i> 2;i-=2)    {        if(2*s[0]+s[i]+s[i-1] >s[0]+2*s[1] +s[i])    {    sum+=s[0]+2*s[1] +s[i];    }    else sum+=2*s[0]+s[i]+s[i-1];        }    sum+=s[0]+s[2];    }                            printf("%d\n",sum);    }return 0;}


0 0
原创粉丝点击