首页 > 其他分享 >【ARC105C】Camels and Bridge 题解

【ARC105C】Camels and Bridge 题解

时间:2022-11-08 14:35:03浏览次数:44  
标签:ARC105C 10 ch Bridge int 题解 骆驼 p1 buf

题意

给定 \(n\) 只骆驼和每条骆驼的重量 \(a_i\)。
这些骆驼要通过一条路,这条路被分为 \(m\) 个部分,每个部分的长度为 \(l_i\),限重为 \(v_i\)。同时经过这部分的骆驼的重量和不能超过限重,否则就会坍塌。
你可以指定这 \(n\) 只骆驼的顺序和两两之间的距离,问第一只骆驼和最后一只的最短距离。如果走不了,输出 \(-1\)。
\(n \leq 8,m \leq 10^5,l_i,r_i,v_i \leq 10^8\)。

Sol

看到 \(n\) 很小,考虑暴力一点的做法。
首先记一个 \(w_s\) 表示当前骆驼集合为 \(s\) 时需要隔开的距离。
然后暴力枚举骆驼的顺序,记 \(dp_i\) 表示前 \(i\) 只骆驼的最短距离。直接转移即可。
时间复杂度 \(O(n!n^2)\)。

Code

//LYC_music yyds!
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0)
#define lowbit(x) (x&(-x))
using namespace std;
inline char gc()
{
	static char buf[1000000],*p1=buf,*p2=buf;
	return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
}
int read()
{
	int pos=1,num=0;
	char ch=getchar();
	while (!isdigit(ch))
	{
		if (ch=='-') pos=-1;
		ch=getchar();
	}
	while (isdigit(ch))
	{
		num=num*10+(int)(ch-'0');
		ch=getchar();
	}
	return pos*num;
}
void write(int x)
{
	if (x<0)
	{
		putchar('-');
		write(-x);
		return;
	}
	if (x>=10) write(x/10);
	putchar(x%10+'0');
}
void writesp(int x)
{
	write(x);
	putchar(' ');
}
void writeln(int x)
{
	write(x);
	putchar('\n');
}
mt19937 rnd(chrono::system_clock::now().time_since_epoch().count());
uint32_t y=rnd();//normally y will in [0,2^32)
const int N=1e5+10;
int n,a[N],l[N],v[N],w[N],p[N],dp[N],ans,m;
signed main()
{
	n=read(); m=read();
	for (int i=1;i<=n;i++) a[i]=read();
	for (int i=1;i<=m;i++) l[i]=read(),v[i]=read();
	for (int i=1;i<=n;i++)
		for (int j=1;j<=m;j++)
			if (a[i]>v[j]) return puts("-1"),0;
	for (int S=1;S<(1<<n);S++)
	{
		int s=0;
		for (int i=1;i<=n;i++)
			if ((S>>(i-1))&1) s+=a[i];
		for (int i=1;i<=m;i++)
			if (s>v[i]) w[S]=max(w[S],l[i]);
	}
	for (int i=1;i<=n;i++) p[i]=i; ans=0x3f3f3f3f;
	do
	{
		dp[0]=0;
		for (int i=2;i<=n;i++)
		{
			int now=1<<(p[i]-1); dp[i]=0;
			for (int j=i-1;j;j--) now|=1<<(p[j]-1),dp[i]=max(dp[i],dp[j]+w[now]);
		}
		ans=min(ans,dp[n]);
	}while(next_permutation(p+1,p+n+1));
	writeln(ans);
}




标签:ARC105C,10,ch,Bridge,int,题解,骆驼,p1,buf
From: https://www.cnblogs.com/dd-d/p/16869608.html

相关文章

  • CF1368G Shifting Dominoes 题解
    CF1368GShiftingDominoes题解题目传送门CF1368GShiftingDominoes题目大意给你一个\(n\timesm\)的棋盘,上面有\(\frac{n\timesm}{2}\)个不重叠的骨牌,你可以......
  • odoo备份数据库无法备份问题解决:Command 'pg_dump' not found.
    背景景:ubuntu20.04上用命令安装postgresql后,odoo备份数据库报如下错误安装命令:sudoapt-getinstallpostgresql默认安装:14版本的pg错误代码如下:  问题原因:是pg......
  • CSP-S 星战题解
    更好的体验首先可以观察出一个性质,只要每个点的出度都是1,那么就一定会满足“每个点都能进入一个环”的性质,也就是说只要每个点出度为1,那么该情况就是合法的。然后考虑怎......
  • AHOI2022山河重整 题解
    首先容易得到\(O(n^2)\)的解法,容易观察得出任意时刻范围都应是\([1,\sum]\)否则直接寄了。考察\(i\)使得\([1,i]\)都能凑出但\(i+1\)不行。则有\(\sum\limits_......
  • Long数据类型序列化Json后传递给前端,产生的精度丢失的问题解决
    问题产生的原因Long类型的数据,如果我们在后端将结果序列化为json,直接传给前端的话,在Long长度大于17位时会出现精度丢失的问题。java中的long能表示的范围比js中number大,......
  • 洛谷--【P1618】三连击升级版题解 排列枚举+循环枚举+stl
    题目描述将 1,2,…,91,2,…,9 共 99 个数分成三组,分别组成三个三位数,且使这三个三位数的比例是 A:B:C,试求出所有满足条件的三个三位数,若无解,输出 No!!!。输入格式......
  • 【题解】CSP-J2022
    CSP-J2022题解/Limie T1.乘方 简要题意:给定a,b,求a^b(a^b表示a的b次方)是否大于10^9,大于输出-1,小于等于输出a^b。分析:此题直接枚举1~b会超时,故考虑用位数判断大小,a^b......
  • Ubuntu16.04下conda虚拟环境编译cv_bridge
    1.进入conda虚拟环境后,安装相关包pipinstallrosdeprosinstallcatkin_pkgrospkgnumpypyyamlopencv-python2.初始化工作空间并获取vision_opencvmkdir-pros_cv_......
  • BUUCTF [ACTF新生赛2020]SoulLike题解(非爆破)
    查壳发现无壳。   IDA检查main函数显然先检查了输入是否以actf{开头进入sub_83A无法进入 点不进去是因为IDA限制了解析函数的长度,可以修改IDA下cfg......
  • git 问题解决
    1.fatal:theremoteendhungupunexpectedlygitconfig--globalhttp.postBuffer104857600其他方案:gitconfig--globalpack.windowMemory100mgitconfig-......