题解 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;
}

最后再聊聊,这题目背景让我这只单身蒟蒻深感不安啊(做个题目还要被塞狗粮)

原文地址:https://www.cnblogs.com/oierscw/p/12548513.html