2392 kkksc03考前临时抱佛脚
搜索啊,怎么找到的?从写挂的里面找到的
首先,一个思路就是贪心如果左脑的所用时间少就加在左脑,如果右脑所有时间少就加在右脑
所以,贪心肯定不对
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
using namespace std;
int a[5];
int sum1,sum2;
int t,homework;
int main()
{
for(int i=1;i<=4;i++)
{
cin>>a[i];
}
for(int i=1;i<=4;i++)
{
sum1=sum2=0;
for(int j=1;j<=a[i];j++)
{
cin>>homework;
if(sum1<=sum2) sum1+=homework;
else sum2+=homework;//看看哪边时间短
t+=max(sum1,sum2);
}
}
cout<<t<<endl;
return 0;
}
所以,这个题绝对不是贪心,需要用贪心的对立面来做,也就是
动态规划!!!!
对于每一个题有且只有两个状态,一个是加在左脑,一个是加到右脑,所以就是一个叫做01背包的东西
其实这里还可以用一个思想,将一边的脑子加到最接近一半则另一边的脑子就是正解
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
int a[5];
int sum;
int t;
int homework[21],f[2501];
int main()
{
for(int i=1;i<=4;i++)
{
cin>>a[i];
}
for(int i=1;i<=4;i++)
{
sum=0;
for(int j=1;j<=a[i];j++)
{
cin>>homework[j];
sum+=homework[j];
}
for(int j=1;j<=a[i];j++)
for(int k=sum/2;k>=homework[j];k--)
f[k]=max(f[k],f[k-homework[j]]+homework[j]);//01背包
t+=sum-f[sum/2];
for(int j=1;j<=sum/2;j++)
f[j]=0;
}
cout<<t<<endl;
return 0;
}