蒟蒻暴搜tle5个点求助
  • 板块P1220 关路灯
  • 楼主Tyyyyyy
  • 当前回复8
  • 已保存回复8
  • 发布时间2020/7/23 20:10
  • 上次更新2023/11/6 22:28:36
查看原帖
蒟蒻暴搜tle5个点求助
333574
Tyyyyyy楼主2020/7/23 20:10
#include<bits/stdc++.h>
using namespace std;
int n,c,ans_now,ans=1e7,total;
bool m[51],can;
struct light
{
	int x,w;
}l[51];
bool cmp(light p,light q)
{
	return p.x<q.x;
}
void dfs(int place)
{
	bool k=false;
	int i=place;
	while(m[i]&&i<n)i++;
	if(!m[i])
	{
		m[i]=1;
		ans_now+=total*(l[i].x-l[place].x);
		total-=l[i].w;
		dfs(i);
		total+=l[i].w;
		ans_now-=total*(l[i].x-l[place].x);
		m[i]=0;
		k=1;
		i=place;
	}
	while(m[i]&&i>1)i--;
	if(!m[i])
	{
		m[i]=1;
		ans_now+=total*(l[place].x-l[i].x);
		total-=l[i].w;
		dfs(i);
		total+=l[i].w;
		ans_now-=total*(l[place].x-l[i].x);
		m[i]=0;
		k=1;
		i=place;
	}
	if(!k)ans=min(ans_now,ans);
}
int main()
{
	scanf("%d%d",&n,&c);
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&l[i].x,&l[i].w);
		total+=l[i].w;
		if(!can&&i==c)
		{
			c=l[i].x;
			total-=l[i].w;
			m[i]=can=1;
		}
	}
	sort(l+1,l+n+1,cmp);
	for(int i=1;i<=n;i++)
	{
		if(c==l[i].x)
		{
			c=i;
			break;
		}
	}
	dfs(c);
	printf("%d",ans);
	return 0;
}

蒟蒻怀疑需要亿点点小小的玄学剪枝

2020/7/23 20:10
加载中...