1402_Magnificent Meatballs

来源:互联网 发布:js禁止浏览器滚动条 编辑:程序博客网 时间:2024/06/07 03:15


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 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.

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.


Source: Mid-Central USA 2002

***********************************************************************************************************************************************

//题意:一个数组,从前后分别将数组里的数加,查是否存在某一位置使前后之和相等。很容易多想,其实如程序中简单的逼近就可以了,因为存在的话,这种方法总是能够找     出来

#include<iostream>
using namespace std;
#define max 31
int main()
{
int num;
int i,j;
int start,end;
int seats[max];
while(cin>>num&&num)
{  
i=j=start=end=0;
for(j=0;j!=num;j++)
cin>>seats[j];
--j;//在for循环中,最后j多加了1
while(i<=j)
{
if(start<=end)
{
  start+=seats[i];
  ++i;
   }
else
{
  end+=seats[j];
  --j;
}
}
if(start==end)
            cout<<"Sam stops at position "<<i-1+1<<" and Ella stops at position "<<j+1+1<<"."<<endl;//双向逼近,当i=j时,下一步就看seats[i]归为前者还是后者,不过总有位置                                                                                                                                                                                     i-1和j+1;后面的同时加1是因为数组从零开始,饭桌从1开始
else
cout<<"No equal partitioning."<<endl;
}
return 0;
}



原创粉丝点击