其实这是一个系列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 }
对于五级的题目:
发现最小值最大,可以考虑二分答案,暴力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; }