Equal Sum Partitions

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 551    Accepted Submission(s): 409

Problem Description
An equal sum partition of a sequence of numbers is a grouping of the numbers (in the same order as the original sequence) in such a way that each group has the same sum. For example, the sequence:

2 5 1 3 3 7

may be grouped as:

(2 5) (1 3 3) (7)

to yield an equal sum of 7.



Note: The partition that puts all the numbers in a single group is an equal sum partition with the sum equal to the sum of all the numbers in the sequence.



For this problem, you will write a program that takes as input a sequence of positive integers and returns the smallest sum for an equal sum partition of the sequence.
 
Input
The first line of input contains a single integer
P
, (1 ≤ P ≤ 1000), which is the number of data sets that follow. The first line of each data set contains the data set number, followed by a space, followed by a decimal integer
M, (1 ≤ M ≤ 10000), giving the total number of integers in the sequence. The remaining line(s) in the dataset consist of the values, 10 per line, separated by a single space. The last line in the dataset may contain less than
10 values.
 
Output
For each data set, generate one line of output with the following values: The data set number as a decimal integer, a space, and the smallest sum for an equal sum partition of the sequence.
 
Sample Input
3
1 6
2 5 1 3 3 7
2 6
1 2 3 4 5 6
3 20
1 1 2 1 1 2 1 1 2 1
1 2 1 1 2 1 1 2 1 1
 
Sample Output
1 7
2 21
3 2
 
Source
 
Recommend

/*
题意:n个数,分成若干个集合,要求每一个集合的数和同样,求集合最小值
思路:枚举当前集合推断是否满足条件 */
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std; typedef __int64 ll; #define N 10005
#define INF 0x3f3f3f3f int sum[N];
int n; bool fdd(ll temp)
{
int hh=0;
int pos=0;
while(pos!=n)
{
hh+=temp;
pos=upper_bound(sum+1,sum+n+1,hh)-(sum+1);
if(sum[pos]!=hh)
{
return false;
}
}
return true;
} int main()
{
int i,j,t,ca;
sum[0]=0;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&ca,&n);
int x;
for(i=1;i<=n;i++)
{
scanf("%d",&x);
sum[i]=sum[i-1]+x;
} for(i=1;i<=n;i++)
if(fdd(sum[i])) break; printf("%d %d\n",ca,sum[i]);
}
return 0;
}

最新文章

  1. WCF实现事件通知相关应用技巧介绍
  2. jquery/zepto 圣诞节雪花飞扬
  3. 计算机网络中的帧封装(C实现)
  4. C#Light/Evil合体啦
  5. ios UI 适配布局相关文章
  6. Unity 资源管理与更新
  7. Oracle DB SQL 性能分析器
  8. POJ 1823 Hotel 线段树
  9. trove instance service 总结
  10. 二十七、oracle 例外
  11. nginx内置全局变量
  12. hdu3974 找上属的模拟
  13. MySQL基础、主从复制、优化
  14. python excel的操作
  15. Mac osx 系统安装 eclipse
  16. 升级nginx 和nchan
  17. cookie and sesssion
  18. EBR内容解析
  19. python 画圆
  20. WCF推送

热门文章

  1. java web 学习笔记 - 表达式语言
  2. iOS重签
  3. 类的封装,property特性,类与对象的绑定方法和非绑定方法,
  4. vue动态加载组件
  5. caffe编译
  6. Mysql使用导出导入数据库
  7. mysql group_concat函数详解
  8. HTML location 用法(获取当前URL)
  9. switch、try-catch
  10. Json Web Token(JWT)详解