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;
}
}

浙公网安备 33010602011771号