acm pku 1247 Magnificent Meatballs的算法实现

Magnificent Meatballs

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.

Source

Mid-Central USA 2002

 

分析:问题可以简单地转成如下形式: 给定一个具有N个点的圆,圆上的点按照1N进行编号,且每个点具有不同权重,问是否存在一整数i, 使得1i的权重和等于i+1N的权重和

 

代码实现:

#include <string.h>

#include "iostream"

using namespace std;

 

int Sam;

 

bool SearchMB(int *MB, int N)

{

       int total = 0, temp = 0;

       int i;

       for(i = 0; i < N; i++)

              total += MB[i];

       if(total%2 != 0)

       {

              return false;

       }

       else

       {

              i = 0;

              while(i < N && temp < total/2)

              {

                     temp += MB[i];

                     i++ ;

              }    

              if(temp == total/2)

              {

                     Sam = i;

                     return true;

              }

              else

                     return false;

       }

}

 

int main(void)

{

       int N, i;

       int MB[40];

 

       cin >> N;

       while(N != 0)

       {

              memset(MB, 0, sizeof(int)*40);

              for(i = 0; i < N; i++)

                     cin >> MB[i];

              if(SearchMB(MB, N))

                     cout << "Sam stops at position " << Sam << " and Ella stops at position " << (Sam+1) << "." << endl;

              else

                     cout << "No equal partitioning." << endl;

              cin >> N;

       }

       return 0;

}

 

执行结果:

Problem: 1247

 

User: uestcshe

Memory: 228K

 

Time: 16MS

Language: C++

 

Result: Accepted

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值