列表

详情


NC14314. Split

描述

你有一个大小为𝑆的𝐽𝑎𝑏𝑏𝑦,每次你可以从你已有的𝐽𝑎𝑏𝑏𝑦中选择一个大小不为1的𝐽𝑎𝑏𝑏𝑦,设他的大小为𝑄,然后把它分裂成𝑎和𝑄−𝑎,其中1≤𝑎<𝑄,这样你获得的收益是𝑎∗(𝑄−𝑎)给定𝑆,𝑀,求最少分裂几次才能得到至少𝑀的收益

输入描述

第一行两个正整数𝑆,𝑀

输出描述

输出一个非负整数表示答案
如果无法达到𝑀的收益输出−1

示例1

输入:

765 271828

输出:

14

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 4ms, 内存消耗: 484K, 提交时间: 2019-03-22 20:06:11

#include<bits/stdc++.h>
using namespace std;
#define int long long
int s,m,l,r,ans,mid,a,b;
bool pd(int x)
{
    a=s/x;b=s%x;
    return(s*s-a*a*(x-b)-(a+1)*(a+1)*b)/2>=m;
}
signed main()
{
    scanf("%lld%lld",&s,&m);
    l=1;r=s;
    while(l<=r)
    {
        mid=(l+r)/2;
        if(pd(mid))ans=mid,r=mid-1;
        else l=mid+1;
    }
    cout<<ans-1;
    return 0;
}

C++ 解法, 执行用时: 5ms, 内存消耗: 312K, 提交时间: 2021-09-10 21:03:12

#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b;
cin>>a>>b;
for(int i=1;i<a;i++)
{
int f=a,c,d,e=0;
for(int j=1;j<=i;j++)
{
c=f/(i-j+2);
d=f-c;
e+=c*d;
f=d;
}
if(e>=b)
{
cout<<i;
return 0;
}
}
cout<<-1;
return 0;
}

C 解法, 执行用时: 8ms, 内存消耗: 312K, 提交时间: 2022-04-20 19:41:02

#include<stdio.h>
int main()
{
int a,b;
scanf("%d %d",&a,&b);
for(int i=1;i<a;i++)
{
int f=a,c,d,e=0;
for(int j=1;j<=i;j++)
{
c=f/(i-j+2);
d=f-c;
e+=c*d;
f=d;
}
if(e>=b)
{
printf("%d",i);
return 0;
}
}
printf("-1");
return 0;
}

上一题