Dream__Sky @ 2023-05-08 23:20:17
题目描述
小明的数学计算能力超强,常常在同学们面前表面得很骄傲。数学科代表实在看不下去了,决定出道很麻烦的题,好好“折磨”他一下。
数学科代表决定给他一些数,让他分组。从第一个数开始分组,且每组必须是连续的一段数,要求每组和相等,问每组和最小可以是多少。(当然这些数一定可以被分组,大不了直接分成一组。)
输入
第一行为一个数
第二行为
输出
一行,最小的和
样例输入输出
输入#1
6
2 5 1 3 3 7
输出#1
7
输入#2
6
1 1 2 3 2 3
输出#2
12
提示
【样例1说明】
分成三组(2,5) (1,3,3) (7) 和为7,不存在比7更小的和。
【数据规模】
测试点
| 1 | n=10 |
|---|---|
| 2 | n=100 |
| 3 | n=1000 |
| 4 | n=200000 |
| 5 | n=200000 |
| 6 | n=1000000 |
| 7 | n=1000000 |
| 8 | n=1000000 |
| 9 | n=1000000 |
| 10 | n=1000000 |
这道题正解是什么?
#include<bits/stdc++.h>
using namespace std;
long long s,minsum=1e+15;
int a[1000001],n,i;
bool find(long long I){
long long cnt=0;
for(i=1;i<=n;i++){
cnt+=a[i];
if(cnt>I)return 0;
if(cnt==I)cnt=0;
}
return 1;
}
int main()
{
scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d",&a[i]);s+=a[i];}
for(long long i=1;i*i<=s;i++){
if(find(i))minsum=min(minsum,i);
if(find(s/i))minsum=min(minsum,s/i);
}
cout<<minsum;
}
数据有点水,这个暴力枚举每种可能的答案的代码都能过(还是本来就能过?)
如果本来就能过,能不能说明一下最劣的情况,以及时间复杂度
如果不行,各位大佬能不能提供一下正解的思路
谢谢!
by Fjionzy @ 2023-05-08 23:26:41
@Dream__Sky 二分?
by Fjionzy @ 2023-05-08 23:26:52
@Dream__Sky 我试试
by Charon__ @ 2023-05-08 23:29:24
@StarlitSky 二分答案应该不存在单调性吧。(雾)
by Dream__Sky @ 2023-05-08 23:30:26
那二分答案怎么求最小
by Dream__Sky @ 2023-05-08 23:30:53
@Kasa_ 我也觉得
by Fjionzy @ 2023-05-08 23:31:39
@Kasa_ 我做过类似的,应该是二分
by Fjionzy @ 2023-05-08 23:34:16
@Kasa_ 好像也是
by Fjionzy @ 2023-05-08 23:34:57
@Dream__Sky
#include<bits/stdc++.h>
using namespace std;
long long n,a[100005],s;
long long start,finish,mid;
bool pd(long long x)
{
long long t=0;
for(int i=1;i<=n;i++)
{
t+=a[i];
if(t==x) t=0;
else if(t>x) return false;
}
if(t==0) return true;
else return false;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],s+=a[i];
start=0,finish=s+1;
while(start+1<finish)
{
mid=(start+finish)/2;
if(pd(mid)) finish=mid;
else start=mid;
}
cout<<finish;
return 0;
}
by Dream__Sky @ 2023-05-08 23:37:23
@StarlitSky 错了
by Dream__Sky @ 2023-05-08 23:38:09
没有单调性吧,有时候反而有些小的还凑不好,大的就刚刚好了