九度 题目1251:序列分割
来源:互联网 发布:网络蜘蛛 磁力搜索 编辑:程序博客网 时间:2024/06/07 18:50
- 题目描述:
一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1;
{3,6}{2,4,3} m=2
{3,3}{2,4}{6} m=3 所以m的最大值为3。
- 输入:
存在多组数据,每组数据一定行为一个正整数n(n<=64),第二行为n个数字。当n为0时,测试结束。
- 输出:
输出最大值m。
- 样例输入:
95 2 1 5 2 1 5 2 141 2 3 40
- 样例输出:
4 2
//////////////////////////////////////////////////////////////////////////
最近懒癌又发作了
数字分组要从数组最大的元素开始分配,因为一般来说,最大元素配成一组选择的范围要小于至多等于稍小的元素,所以代码如下:
#include<iostream>#include<string.h>using namespace std;bool ga;bool used[65];int n;bool rev(int*v,int vlen,int*msum,int m,int mv)//msum是用来记录当前分组的和是多少,m是当前第几个分组(从大到小),mv表示每个分组和的最大值{ if(m==0)//已经将所有元素分配好了 { ga=true; return true; } return rev(v,0,msum,m-1,mv);//当前分组刚好符合要求,进行下一个分组 int i; for(i=vlen;i<n;i++) { if(used[i]||msum[m]+v[i]>mv)//将没分配过的元素分配到当前组溢出,表明此分配不适合,下一个接着分配 continue ; used[i]=true; { ga=true; return true; } msum[m]-=v[i]; used[i]=false; //if(msum[m]-v[i]==0)//最大的已经试过了 //break; if(msum[m]==0) break; while(i<n-1&&v[i]==v[i+1]) i++; } return false;} int main(){ while(cin>>n&&n!=0) { int v[65]; int j,k,i,temp,sum; for(j=0;j<n;j++)//这里的排序感觉效率不佳,可以用sort函数 { if(j==0) { cin>>v[0]; sum=v[0]; } else { cin>>v[j]; sum+=v[j]; for(k=0;k<j;k++) if(v[j]>v[k]) break; temp=v[j]; for(i=j;i>k;i--) v[i]=v[i-1]; v[k]=temp; } } int msum[65]={0}; ga=false; for(j=(sum/v[n-1])<n?(sum/v[n-1]):n;j>1;j--) if(sum%j==0) { memset(used,0,sizeof(used)); memset(msum,0,sizeof(msum)); rev(v,0,msum,j,sum/j); if(ga) { cout<<j<<endl; break; } } if(!ga) cout<<1<<endl; } return 0; }/************************************************************** Problem: 1251 User: 午夜小白龙 Language: C++ Result: Accepted Time:10 ms Memory:1520 kb****************************************************************/
0 0
- 九度 题目1251:序列分割
- 题目1251:序列分割
- 九度OJ 1251:序列分割 (DFS)
- 题目1251:序列分割(DFS+剪枝)
- 九度 题目1377:缓变序列
- 题目1366:栈的压入、弹出序列-九度
- 九度online-题目1480:最大上升子序列和
- 题目1533:最长上升子序列-九度
- 【九度】题目1393:合并两个排序序列
- 【九度】题目1337:寻找最长合法括号序列
- 【九度】题目1376:最近零子序列
- 九度题目1342:寻找最长合法括号序列II
- 九度 题目1366:栈的压入、弹出序列
- 九度题目1011:最大连续子序列
- 九度题目1011:最大连续子序列
- 九度题目1393:合并两个排序序列
- 九度OJ—题目1011:最大连续子序列
- 九度 题目1011:最大连续子序列
- vue-lazyload
- 强化学习系列<1>、强化学习入门简介
- filter用法。
- Linux系统 /dev/mapper/VolGroup-lv_root 100% 解决方案
- PO BO VO DTO POJO DAO概念及其作用(附转换图)
- 九度 题目1251:序列分割
- Java之进程与线程练习
- ubuntu下matlab启动报错java.lang.runtime.Exception**********************
- [Android]:View的位置参数
- 网页表格直接导出为Excel文件
- 简单实现生产者消费者问题
- 集群因子 例子
- centos 7 安装git客户端
- Boost.Interprocess使用手册翻译之七:托管内存片段(Managed Memory Segments)