zoukankan      html  css  js  c++  java
  • NYOJ-47 过河问题 http://acm.nyist.net/JudgeOnline/problem.php?pid=47

     

    过河问题

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:5
     
    描述

    在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,N个人一共只带了一只手电筒,而桥窄得只够让两个人同时过。如果各自单独过桥的话,N人所需要的时间已知;而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间。问题是,如何设计一个方案,让这N人尽快过桥。 

     
    输入
    第一行是一个整数T(1<=T<=20)表示测试数据的组数
    每组测试数据的第一行是一个整数N(1<=N<=1000)表示共有N个人要过河
    每组测试数据的第二行是N个整数Si,表示此人过河所需要花时间。(0<Si<=100)
    输出
    输出所有人都过河需要用的最少时间
    样例输入
    1
    4
    1 2 5 10
    样例输出
    17
    来源
    POJ

    解题思路:
      首先按照过河时间从小到大排序,当n>3时候,就是考虑用最小时间先把用时最长的两个人送过河,
    且手电筒仍然留在未过河的这边,剩下的再依次求解。

    把当前用时最长的两个人送过河可以考虑两种方案:
    方案一:
      1 号和 2 号先过河,然后 1 号回来,n 号和 n-1 号过河,然后 2 号再回来
    用时:2*a[2]+a[1]+a[n];
    方案二:
      1 号和 n 号先过河,然后 1 号再回来,1 号和 n-1 号再过河,之后 1 号再回来
    用时:a[n]+a[n-1]+2*a[1];

      所以每次把用时最长的两个人送过河用时应该取上述两种方案中的最小值。至于为什么要先考虑
    把用时最长的两个人送个和用的是贪心的思想,因为只有两个用时最长的两个人一块过河才能保证
    用时次长的人不会占用过河时间,将时间降到最低.

    这是参考人家的解题思路,不过很正确。

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    int a[1010];
    int cmp(const void *a,const void *b)
    {
    	return *(int *)a-*(int *)b;
    }
    
    int sss(int a,int b)
    {
    	return a<b?a:b;
    }
    
    int fun(int m)
    {
    	if(m<=2)
    		return a[m];
    	if(m==3)
    		return a[3]+a[1]+a[2];
    	else
    		return fun(m-2)+sss(a[m]+a[m-1]+2*a[1],a[m]+a[1]+2*a[2]);
    }
    
    int main()
    {
    
    	int i,n,m;
    	scanf("%d",&n);
    	while(n--)
    	{
    		memset(a,0,sizeof(a));
    		scanf("%d",&m);
    		for(i=1;i<=m;i++)
    			scanf("%d",&a[i]);
    		qsort(a+1,m,sizeof(a[1]),cmp);
    		printf("%d
    ",fun(m));
    	}
    	return 0;
    }
    
     
     
     
     
  • 相关阅读:
    spring和mybatis整合配置文件
    点击不同按钮,加载不同的页面(不使用iframe的情况下)
    两个完整的jquery slide多方面滑动效果实例
    autofac无法解析一例
    c# Random太快产生的随机数会重复
    linq和ef关于group by取最大值的两种写法
    JavaScript 汉字与拼音互转终极方案 附JS拼音输入法
    使用USB Key(加密狗)实现身份认证
    让Dreamweaver支持cshtml (MVC Razor环境)
    使用EF扩展EntityFramework.BulkInsert实现批量插入
  • 原文地址:https://www.cnblogs.com/wangyouxuan/p/3259772.html
Copyright © 2011-2022 走看看