其实这题有个更暴力的算法
  • 板块P2080 增进感情
  • 楼主CNzzc
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/9/30 19:24
  • 上次更新2024/9/30 19:33:45
查看原帖
其实这题有个更暴力的算法
750689
CNzzc楼主2024/9/30 19:24

这种算法的复杂度达到了O(2^n)

要不要猜猜是什么

没错,就是大名鼎鼎的二进制枚举!

纯二进制枚举是会TLE的

纯二进制枚举

期望得分:80tps

const int N=3e1+10;
int n,v;
pair<int,int> a[N];
int ct,res,ans,b,c;
void solve()
{
	cin>>n>>v;
	up(i,0,n-1,1){
		cin>>a[i].first>>a[i].second;
	}
	ans=INT_MAX;
	for(int i=0;i<(1<<n);i++){
		ct=0;
		res=0;
		b=0;
		c=0;
		for(int j=0;j<n;j++){
			if(((i>>j)&1)==1){
				ct+=a[j].first+a[j].second;
				res++;	
				b+=a[j].first;
				c+=a[j].second;
			}
		}
		if(ct>v){
			ans=min(ans,abs(b-c));
		}
	}
	if(ans==INT_MAX){
		ans=-1;
	}
	cout<<ans;
	return;
}

当答案不能更优时,也就是当前的好感值只差为0时,我们直接退出循环

期望得分:100tps

#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define up(i,j,k,l) for(int i=j;i<=k;i+=l)
#define down(i,j,k,l) for(int i=j;i>=k;i-=l)
using namespace std;
const int N=3e1+10;
int n,v;
pair<int,int> a[N];
int ct,res,ans,b,c;
void solve()
{
	cin>>n>>v;
	up(i,0,n-1,1){
		cin>>a[i].first>>a[i].second;
	}
	ans=INT_MAX;
	for(int i=0;i<(1<<n);i++){
		ct=0;
		res=0;
		b=0;
		c=0;
		for(int j=0;j<n;j++){
			if(((i>>j)&1)==1){
				ct+=a[j].first+a[j].second;
				res++;	
				b+=a[j].first;
				c+=a[j].second;
			}
		}
		if(ct>v){
			ans=min(ans,abs(b-c));
			if(ans==0){
				break;
			}
		}
	}
	if(ans==INT_MAX){
		ans=-1;
	}
	cout<<ans;
	return;
}
int main()
{
    ios::sync_with_stdio(false);
	cin.tie(0);
	//freopen(".in","r",st din);
	//freopen(".out","w",stdout);
	int _=1;
	//cin>>_;
	up(i,1,_,1){
		solve();
	}
	return 0;
}
2024/9/30 19:24
加载中...