L3-029 还原文件(天梯赛)


这个题纯属把我逗乐了

首先分析暴力比较肯定不行,那咋办

这个问题的难点就在于每次比较有多个数,很难搞

于是我们就把多个数压缩成一个值就好了

这个题为啥把我逗乐了 因为我想的是把每个碎片的数平方再加到一起 压缩成一个值

好巧不巧的是 刚好样例就可以hack掉这个压缩 看来出题人是想过这个问题的

那我就每个数加一再平方不就好了

最后就是扫一遍dfs就好

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const int maxn=1e5+5;
int n,m,cnt;
bool pp=false;
ll a[maxn],pre[maxn],val[maxn],ans[maxn];
map<ll,int>mp;
set<ll>Q;
set<ll>:: iterator ii;
void dfs(int id){ 
	if(pp)return ; 
	if(id>=n){
		pp=true;
	for(int i=1;i<cnt;i++)
	cout<<a[i]<<" ";
	cout<<a[cnt]; 
		return;
	}
	for(int i=id+1;i<=n;i++){
	ii=Q.find(pre[i]-pre[id-1]);
	if(ii==Q.end())continue;
	a[++cnt]=mp[*ii];Q.erase(ii);
	dfs(i);
	--cnt;Q.insert(*ii);
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];a[i]++;
		pre[i]=pre[i-1]+a[i]*a[i];
	}
	cin>>m;
	for(int t,i=1;i<=m;i++){
		cin>>t;
		for(int j=1,c;j<=t;j++){
			cin>>c;c++;
			val[i]+=c*c; 
		}
		mp[val[i]]=i;
		Q.insert(val[i]);
	}
	dfs(1);
	
     return 0;
}

昨天又做了一次 发现其实用不着将多个数转为一个数 直接暴力dfs即可

#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
void solve();
const int maxn=1e5+5;
int a[maxn],ans[105],vis[105];
int n,m;
vector<int>Q[105];
int main(){
	int T;T=1;
	while(T--)solve();
     return 0;
}
bool ck(int num,int now){
	if(now==1){
		for(int i=0;i<Q[num].size();i++)
	if(a[now+i]!=Q[num][i]){
		return 0;
	}
	return 1;
	}
	else {
		for(int i=0;i<Q[num].size();i++)
	    if(a[now+i-1]!=Q[num][i]){
		return 0;
	}
	return 1;
	}
}
void dfs(int,int); 
void solve(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	cin>>m;
	for(int i=1;i<=m;i++){
		int k,x;
		cin>>k;
		for(int j=1;j<=k;j++)
		cin>>x,Q[i].push_back(x);
	}
	dfs(1,1);
}
void dfs(int id,int pp){
	if(id==n+1){
		printf("%d",ans[1]);
		for(int i=2;i<pp;i++)
		printf(" %d",ans[i]);
		return;
	}
	for(int i=1;i<=m;i++)
	if(!vis[i]&&ck(i,id)){
		vis[i]=1;ans[pp]=i;
		if(id==1)
		dfs(id+Q[i].size(),pp+1);
		else dfs(id+Q[i].size()-1,pp+1);
		vis[i]=0;
	}
}

posted @ 2022-03-28 16:05  wzx_believer  阅读(167)  评论(0)    收藏  举报