过河问题——贪心

解题思路
1首先明确 每次要送回去手电筒 这就要求送手电的人必须是他们中最快的
2既然送回手电的人必须是其中最快的 那这个人一定是最后一批到达对面的人
3 两个速度较慢的人一起过河 可以节省时间 比如a b 过河各需要过河时间100 两人分别过河 就必须200 人后一起 就是100, 如果这样 就必须选出速度比较快的两个人 一起过河 然后回来一个送灯 较慢的两个人一起过去 然后 之前过去的另一个速度很快的人回来送灯
4 如果速度最快的两个人速度优势不明显 比如次快等于最慢的 这就会出现时间反而变慢了 这个时候 可以用最快的人送灯 方法是 最快的人和最慢的过去回来再和次慢一起过去
5 重复上面步骤 直到所有人过去 //人数较少于等于3时 需要分类讨论

过河问题

时间限制: 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
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
bool rmp(int a,int b)
{
	return a<b;
}
int i,j,n,m,sum,k;
int a[1005];
int main()
{
	scanf("%d",&m);
	while(m--)
	{
		scanf("%d",&n);
		for(i=0;i<n;i++)
		{
			scanf("%d",&a[i]);
		}
		sort(a,a+n,rmp); sum=0;
		while(n>=4)
		{
			if((a[0]+2*a[1]+a[n-1])<=(2*a[0]+a[n-1]+a[n-2])){
			    sum=sum+a[0]+2*a[1]+a[n-1];
			}
			else{
				sum+=2*a[0]+a[n-1]+a[n-2];
			}
			n-=2;
		}
		if(n==2){
			sum+=a[1];
		}
		else if(n==1){
			sum+=a[0];
		}
		else if(n==3){
			sum+=a[0]+a[1]+a[2];
		}
		printf("%d\n",sum);
	}
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
农夫过河问题是一个经典的逻辑智力游戏,通常涉及到一位农夫要将一只狼、一只羊和一颗白菜带到河的对岸,但是他只有一艘船,船只能容纳他和另外一样物品(不包括船)。 在这个游戏中,农夫必须遵循以下规则: 1. 农夫可以驾驶船只过河,但是他必须在船上才能移动。 2. 狼和羊不能被留在一起,因为狼会吃羊。 3. 羊和白菜也不能被留在一起,因为羊会吃白菜。 你可以使用C语言来解决这个问题,下面是一个简单的程序实现: ```c #include <stdio.h> int main() { int farmer = 1, wolf = 1, goat = 1, cabbage = 1; // 1表示在左岸,0表示在右岸 printf("农夫过河问题解决方案:\n"); while (wolf || goat || cabbage) // 如果有任意一个在左岸,则继续循环 { if (farmer == 1) // 如果农夫在左岸 { if (wolf == 1 && goat == 1 && cabbage == 1) // 如果狼、羊、白菜都在左岸 { printf("农夫带着羊过河\n"); goat = 0; } else if (wolf == 1 && goat == 1 && cabbage == 0) // 如果狼、羊在左岸,白菜在右岸 { printf("农夫带着狼过河\n"); wolf = 0; } else if (wolf == 1 && goat == 0 && cabbage == 0) // 如果狼在左岸,羊、白菜在右岸 { printf("农夫带着羊过河\n"); goat = 1; } else if (wolf == 0 && goat == 1 && cabbage == 0) // 如果狼在右岸,羊、白菜在左岸 { printf("农夫带着白菜过河\n"); cabbage = 1; } else if (wolf == 0 && goat == 0 && cabbage == 1) // 如果狼、羊在右岸,白菜在左岸 { printf("农夫带着羊过河\n"); goat = 1; } } else // 如果农夫在右岸 { if (wolf == 0 && goat == 0 && cabbage == 0) // 如果狼、羊、白菜都在右岸 { printf("农夫带着狼过河\n"); wolf = 1; } else if (wolf == 0 && goat == 0 && cabbage == 1) // 如果狼、羊在右岸,白菜在左岸 { printf("农夫带着白菜过河\n"); cabbage = 0; } else if (wolf == 0 && goat == 1 && cabbage == 1) // 如果狼在右岸,羊、白菜在左岸 { printf("农夫带着狼过河\n"); wolf = 1; } else if (wolf == 1 && goat == 0 && cabbage == 1) // 如果狼、白菜在左岸,羊在右岸 { printf("农夫带着羊过河\n"); goat = 0; } else if (wolf == 1 && goat == 1 && cabbage == 0) // 如果狼在左岸,羊、白菜在右岸 { printf("农夫带着狼过河\n"); wolf = 0; } } farmer = 1 - farmer; // 农夫过河 } printf("农夫成功将狼、羊、白菜都带到了对岸!\n"); return 0; } ``` 在这个程序中,我们使用了四个变量来表示农夫、狼、羊、白菜的位置(1表示在左岸,0表示在右岸)。我们使用一个while循环,只要有任意一样物品在左岸,就继续循环。 在while循环中,我们根据当前的物品位置和农夫的位置,判断应该带哪一样物品过河。当农夫过河后,我们更新物品位置和农夫位置。当狼、羊、白菜都在右岸时,我们跳出循环,输出“农夫成功将狼、羊、白菜都带到了对岸!”。 这个程序只是一个简单的实现,可能存在一些小bug,但是它可以帮助你理解农夫过河问题的解决方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值