POJ1247解题报告

  
Magnificent Meatballs
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 5202 Accepted: 3515

Description

Sam and Ella run a catering service. They like to put on a show when serving meatballs to guests seated at round tables. They march out of the kitchen with pots of meatballs and start serving adjacent guests. Ella goes counterclockwise and Sam goes clockwise, until they both plop down their last meatball, at the same time, again at adjacent guests. This impressive routine can only be accomplished if they can divide the table into two sections, each having the same number of meatballs. You are to write a program to assist them.

At these catering events, each table seats 2 <= N <= 30 guests. Each guest orders at least one and at most nine meatballs. Each place at the table is numbered from 1 to N, with the host at position 1 and the host's spouse at position N. Sam always serves the host first then proceeds to serve guests in increasing order. Ella serves the spouse first, then serves guests in decreasing order. The figures illustrate the first two example input cases.

Input

Input consists of one or more test cases. Each test case contains the number of guests N followed by meatballs ordered by each guest, from guest 1 to guest N. The end of the input is a line with a single zero.

Output

For each table, output a single line with the ending positions for Sam and Ella, or the sentence indicating an equal partitioning isn't possible. Use the exact formatting shown below.

Sample Input

5 9 4 2 8 3
5 3 9 4 2 8
6 1 2 1 2 1 2
6 1 2 1 2 1 1
0

Sample Output

Sam stops at position 2 and Ella stops at position 3.
No equal partitioning.
No equal partitioning.
Sam stops at position 3 and Ella stops at position 4.
就是求当两个人按顺时针方向和按逆时针方向放置肉丸子后,当两个人肉丸子相等时所处的位置。
写了个O(n*n)的算法,囧。
import java.util.*;
public class Main {

	//客人,客人的数目为2~30
	private int[] guests=new int[31];
	//客人的数目
	private int num;
	
	//清空
	public void init()
	{
		for(int i=0;i<=30;i++)
		{
			guests[i]=0;
		}
	}
	
	//构造函数
	public Main()
	{
		Scanner scan=new Scanner(System.in);
		while((num=scan.nextInt())!=0)
		{
			init();
			
			for(int i=1;i<=num;i++)
			{
				guests[i]=scan.nextInt();
			}
			
			//Sam发送的肉丸子数
			int sum1=0;
			//Ella发送的肉丸子数
			int sum2=0;
			boolean tag=true;
			for(int i=1;i<num;i++)
			{
				//i是Sam走的步数
				int m,n;
				sum1=0;
				sum2=0;
				for(m=1;m<=i;m++)
				{
					sum1+=guests[m];
				}
				//System.out.println("m="+(m-1)+" sum1="+sum1);
				for(n=i+1;n<=num;n++)
				{
					sum2+=guests[n];
				}
				//System.out.println("n="+(n-1)+" sum2="+sum2);
				if(sum1==sum2)
				{
					System.out.println("Sam stops at position "+i+" and Ella stops at position "+(i+1)+".");
					tag=false;
					break;
				}
			}
			if(tag){
				System.out.println("No equal partitioning.");
			}
		}
	}
	public static void main(String[] args)
	{
		Main mainf=new Main();
	}
}

POJ1753题目为"Flip Game",题目给出了一个4x4的棋盘,每个格子有黑色或白色,每次翻转一个格子会同时翻转它上下左右四个格子的颜色,目标是把整个棋盘都变为同一种颜色,求把棋盘变成同种颜色的最小步数。 解题思路: 一般关于棋盘变色的题目,可以考虑使用搜索来解决。对于POJ1753题目,可以使用广度优先搜索(BFS)来解决。 首先,对于每个格子,定义一个状态,0表示当前格子是白色,1表示当前格子是黑色。 然后,我们可以把棋盘抽象成一个长度为16的二进制数,将所有格子的状态按照从左往右,从上往下的顺序排列,就可以用一个16位的二进制数表示整个棋盘的状态。例如,一个棋盘状态为: 0101 1010 0101 1010 则按照从左往右,从上往下的顺序把所有格子的状态连接起来,即可得到该棋盘的状态为"0101101001011010"。 接着,我们可以使用队列来实现广度优先搜索。首先将初始状态加入队列中,然后对于队列中的每一个状态,我们都尝试将棋盘上的每个格子翻转一次,生成一个新状态,将新状态加入队列中。对于每一个新状态,我们也需要记录它是从哪个状态翻转得到的,以便在得到最终状态时能够输出路径。 在搜索过程中,我们需要维护每个状态离初始状态的步数,即将该状态转换为最终状态需要的最小步数。如果我们找到了最终状态,就可以输出答案,即最小步数。 代码实现:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值