[RQNOJ646]一道搜索神题

本文探讨了一道独特的问题,需要将具有特定属性的元素分为三个集合,以最小化特定表达式的值。通过深入分析,发现贪心算法和高级算法难以解决此问题,而裸搜索算法却能有效应对。文章详细解释了算法实现过程,并强调了搜索算法在复杂问题求解中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RQNOJ646

现在有N个元素,每个元素具有3个属性Ai, Bi, Ci,现在青青要求把全部元素分为3个集合,称为集合X、集合Y和集合Z,使表达式的值最小。
可以让某个集合为空。

1 ≤ n ≤ 100, 000,1 ≤ Ai, Bi, Ci ≤ 100, 000, 000

 

怎么说呢?

这题是我至今见到过的最神奇的一题。神奇到叹为观止。

经尝试,贪心是不行的,易找出反例。

经尝试,高深的算法和数据结构是很难想出来和写出来的。

经了解,本题可以用搜索做。且必须是裸搜,即O(3^N)的。

经尝试,若加个排序的预处理,写O(NlogN+2^N)是过不了的。

 

对于O(3^(10^5))在1s内跑出,我实在无话可讲。

这就是:只有想不到,没有做不到。

 

 

var
	a,b,c:array[1..1000000] of longint;
	n,i,j,k,l,p,min:longint;
procedure search(i,s1,s2,s3:longint);
begin
	if s1+s2+s3>=min then exit;
	if i<=n then
		        if (a[i]<=s1)or(b[i]<=s2)or(c[i]<=s3) then search(i+1,s1,s2,s3)
		        else
		        begin
                                if a[i]>s1 then search(i+1,a[i],s2,s3);
                                if b[i]>s2 then search(i+1,s1,b[i],s3);
		                if c[i]>s3 then search(i+1,s1,s2,c[i]);
		        end
        else min:=s1+s2+s3;
end;
begin
	readln(n);
	for i:=1 to n do readln(a[i],b[i],c[i]);
	min:=100000000;
	search(1,0,0,0);
	writeln(min);

end.

转载于:https://www.cnblogs.com/oldmanren/archive/2011/10/21/2220691.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值