51nod-1007-正整数分组

Posted zincsabian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51nod-1007-正整数分组相关的知识,希望对你有一定的参考价值。

其实这是一个系列QAQ,刷题顺便熟悉codeblocks

二级 ----------------- 五级


进入正题:

对于二级的题目:

   发现可以转换成一个01背包问题,容量为$(∑ai)/2$,sum=sum1+sum2

  sum2-sum1可以转换成

      $f[(∑ai)/2]-sum1+sum2-f[(∑ai)/2]$

  整理一下变成

    $sum-f[(∑ai)/2]*2$

  然后f是背包的数组

技术分享图片
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<map>
 6 #include<set>
 7 #include<vector>
 8 #include<cstring>
 9 using namespace std;
10 #define ll long long
11 #define inf 0x7fffffff
12 inline int read()
13 {
14     int x=0,f=1;char c=getchar();
15     while(c<0||c>9){if(c==-)f=-1;c=getchar();}
16     while(c>=0&&c<=9){x=x*10+c-0;c=getchar();}
17     return x*f;
18 }
19 inline ll readl()
20 {
21     ll x=0,f=1;char c=getchar();
22     while(c<0||c>9){if(c==-)f=-1;c=getchar();}
23     while(c>=0&&c<=9){x=x*10+c-0;c=getchar();}
24     return x*f;
25 }
26 inline int power(int a,int b)
27 {
28     int ans=1;
29     while(b)
30     {
31         if(b&1){ans=ans*a;--b;}
32         b>>=1;a=a*a;
33     }
34     return ans;
35 }
36 inline int power_mod(int a,int b,int mod)
37 {
38     a%=mod;
39     int ans=1;
40     while(b)
41     {
42         if(b&1){ans=ans*a%mod;--b;}
43         b>>=1;a=a*a%mod;
44     }
45     return ans;
46 }
47 #define max(a,b) a>b?a:b
48 #define min(a,b) a<b?a:b
49 #define  rep(i,l,r) for(int i=l;i<=r;i++)
50 #define down(i,l,r) for(int i=l;i>=r;i--)
51 int n,m,a[105],sum,f[5005];
52 int main()
53 {
54     n=read();sum=0;
55     for(int i=1;i<=n;i++) a[i]=read(),sum+=a[i];m=sum >> 1;
56     for(int i=1;i<=n;i++)
57         for(int j=m;j>=a[i];j--) f[j]=max(f[j],f[j-a[i]]+a[i]);
58     cout<<sum-f[m]-f[m]<<"\n";
59     return 0;
60 }
View Code

对于五级的题目:

  发现最小值最大,可以考虑二分答案,暴力check(),不过我姿势有点弱,二分答案老是炸,注意开long long,check看代码就懂了

技术分享图片
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<cstring>
using namespace std;
#define ll long long
#define inf 0x7fffffff
inline int read()
{
    int x=0,f=1;char c=getchar();
    while(c<0||c>9){if(c==-)f=-1;c=getchar();}
    while(c>=0&&c<=9){x=x*10+c-0;c=getchar();}
    return x*f;
}
inline ll readl()
{
    ll x=0,f=1;char c=getchar();
    while(c<0||c>9){if(c==-)f=-1;c=getchar();}
    while(c>=0&&c<=9){x=x*10+c-0;c=getchar();}
    return x*f;
}
inline int power(int a,int b)
{
    int ans=1;
    while(b)
    {
        if(b&1){ans=ans*a;--b;}
        b>>=1;a=a*a;
    }
    return ans;
}
inline int power_mod(int a,int b,int mod)
{
    a%=mod;
    int ans=1;
    while(b)
    {
        if(b&1){ans=ans*a%mod;--b;}
        b>>=1;a=a*a%mod;
    }
    return ans;
}
#define max(a,b) a>b?a:b
#define min(a,b) a<b?a:b
#define  rep(i,l,r) for(int i=l;i<=r;i++)
#define down(i,l,r) for(int i=l;i>=r;i--)
int n,k,a[50005];
inline bool check(ll x)
{
    ll sum=0;int cnt=k;
    for(int i=1;i<=n;i++)
        if(sum+a[i]>x){cnt--;sum=a[i];}else sum+=a[i];
    return cnt>0;
}
ll l,r,sum;
int main()
{
    n=read();k=read();
    rep(i,1,n) a[i]=read(),sum+=a[i];
    l=1,r=sum;
    while(l<r)
    {
        long long  mid=(l+r) >> 1;
        if(check(mid)) r=mid;
        else l=mid+1;
//        cout<<l<<" "<<r<<"\n";
    }
//    cout<<check(9)<<"\n";
    cout<<l<<"\n";
    return 0;
}
View Code

    

  

 

以上是关于51nod-1007-正整数分组的主要内容,如果未能解决你的问题,请参考以下文章

51Nod 1007 正整数分组 01背包

51nod-1007-正整数分组

51nod1128 正整数分组V2

正整数分组(动态规划)

51nod 1128 二分

1007 正整数分组