题解:AT_abc236_f [ABC236F] Spices

24 年 10 月 9 日 星期三
138 字
1 分钟

贪心好题。题意不再赘述。

思路

cc 数组升序排序,并依次判断每个数 xx。若 xx 可被已被取的数字异或得出,则不取 xx,否则比取。

正确性证明

xx 可被已取的数异或得出,那么显然不用取。若不可被异或得出,则之后定存在取的 yy 使得组合出 xx 必要取 yy,故取 xx 定不劣。

代码

cpp
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=(1<<16)+10;
ll t,n,i,j,ans,a[N],p[N],f[N];
int main(){
	cin>>t;n=(1<<t)-1;f[0]=1;
	for(i=1;i<=n;i++)cin>>a[i],p[i]=i;
	stable_sort(p+1,p+1+n,[](int x,int y){return a[x]<a[y];});
	for(i=1;i<=n;i++)
		if(!f[p[i]]){
			ans+=a[p[i]];
			for(j=0;j<=n;j++)f[j^p[i]]|=f[j];
		}
	cout<<ans;
}

文章标题:题解:AT_abc236_f [ABC236F] Spices

文章作者:Walter_Fang

文章链接:https://blog.walterfang.us.kg/posts/solution-at_abc236_f[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。