题解 P2080 【增进感情】
暴力出神马来着……
总的思路就是二进制模拟,把n件事看成长度为n的二进制序列,然后进行累加,每加一次总的情况就改变一次,所以这个效率是O(n²)的,但剪剪枝也能过
放代码:
#include <bits/stdc++.h>
using namespace std;
int n,v;
int a[40],b[40],f[40];
int p,q,ans;
int main()
{
ans=210000000;
scanf("%d%d",&n,&v);
for(int i=0; i<n; i++)
scanf("%d%d",&a[i],&b[i]);
memset(f,0,sizeof(f));
while(f[n]==0)//这个就是二进制模拟啦
{
f[0]++;//在最低位累加
for(int i=0; i<n; i++)//就像我们平时搞二进制是一样的啦
{
f[i+1]+=f[i]/2;
f[i]%=2;
}
if(f[n]) break;//特判(不加的话每次输出0)
p=q=0;
for(int i=0; i<n; i++)
if(f[i])//增加好感(这出题人……虐狗ing)
{
p+=a[i];
q+=b[i];
}
if((p+q)>=v)
if(abs(p-q)<ans)
ans=abs(p-q);
if(ans==0)//剪枝
{
cout<<0;
return 0;
}
}
if(ans==210000000) cout<<-1;//哈哈哈如果他们不在一起
else cout<<ans;
return 0;
}
最后再聊聊,这题目背景让我这只单身蒟蒻深感不安啊(做个题目还要被塞狗粮)