牛客练习赛148 复盘(A-C)
A 签到题
https://ac.nowcoder.com/acm/contest/127263/A
思路:因为相邻数字的gcd都为1 所以直接顺序输出即可=
B dfs
Bob的蛋糕店
思路:n的范围1-20 dfs即可
点击查看代码
void solution::solve()
{
int n,k;cin>>n>>k;
vector<int> a(n+1);
for(int i=1;i<=n;i++) cin>>a[i];
vector<int> vis(n+1,0);
int f=0;
double sum11=0,sum0=0;
for(int i=1;i<=n;i++) sum11+=i*a[i],sum0+=a[i];
function<void(int,int,int,int)> dfs=[&](double sum1,double sum,int cnt,int p)
{
if(cnt>=k)
{
if(sum1/sum==sum11/sum0) f=1;
return;
}
else if(f) return;
for(int i=p;i<=n;i++)
{
if(vis[i]) continue;
double s1=sum1-a[i]*i,s0=sum-a[i];
vis[i]=1;
dfs(s1,s0,cnt+1,i);
vis[i]=0;
}
};
dfs(sum11,sum0,0,1);
if(f) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
C 应该算模拟?
修复排列
思路:由于答案是往后继承的 所以每次遇到新的数字被挖空了 就先判断之前有没有修改过
如果有则不变 如果没有 则通过类似一条链去寻找 在代码中注释了
点击查看代码
void solution::solve()
{
int n;cin>>n;
vector<int> a(n+1),b(n+1),c(n+1);
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
for(int i=1;i<=n;i++) cin>>c[i];
map<int,int> mp;
for(int i=1;i<=n;i++) mp[a[i]]=i;
//记录了a[i]这个值对应的下标
set<int> st;
for(int i=1;i<=n;i++)
{
int x=b[i];
//只要x没有被找到 说明数组此时没有修复完全
while(st.find(x)==st.end())
{
st.insert(x);
//放入之后再判断a[i]对应的c[i]是否存在
//如果c[i]不存在
//说明a[newi]和对应的c[newi]需要被修改
//newi为c[i]==a[newi]时的取值
x=c[mp[x]];
}
cout<<st.size()<<" \n"[i==n];
}
}
总结
在b题花了太多时间 康复训练还要继续orz 总的来说就是码力差了

浙公网安备 33010602011771号