[Offer收割]编程练习赛79

题目

 

题目1:

题意:

给定一个字符串S,每次操作你可以将其中任意一个字符修改成其他任意字符,请你计算最少需要多少次操作,才能使得S中不存在两个相邻的相同字符。

思路:

从第二个字符往后,如果字符相同ans+1。因为s[i]的改变会对s[i-1],s[i+1]都产生影响,所以若s[i-1]与s[i]相同,改变s[i],那么s[i+1]就不用考虑了。比如aaa,或aab这种情况,改变中间的a,因为有26个小写字母,总能找到一个与两边字符不想关的字母,对于aaa,把中间的a可以换成b,c,d,e...,对于aab可以换成c,d,e,f...

#include<bits/stdc++.h>
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    string s;
    cin>>s;
    int ans=0;
    for(int i=1;s[i]!='\0';)
    {
        if(s[i]==s[i-1])
        {
            ans++;
            i++;
        }
        i++;
    }
    return 0;
}

题目2:

题意:

共有N名员工,编号为1~N,其中CEO的编号是1。除了CEO之外,每名员工都恰好有唯一的直接上司;N名员工形成了一个树形结构。  
我们定义X的1级上司是他的直接上司,2级上司是他上司的上司,以此类推……  
N-1行每行包含一个整数,依次代表编号是2-N的员工的直接上司的编号。请你找出每名员工的D级上司是谁。

思路:

用vector建立树形结构,v[i]表示的是以i为根的所有子节点。
考虑用dfs。dfs是一次性的搜索树的一整条枝。当该结点i相对于root的深度小于d的时候,直接ans[i]=-1,若深度大于d的时候,用path[]数组记录该条枝上的结点,ans[i]=深度-d;

注意:

程序中deep别忘了自减。

#include<bits/stdc++.h>
#define maxn 100005
using namespace std;
vector<int>v[maxn];
int ans[maxn],path[maxn];
int deep,n,d;
void dfs(int q)
{
    if(deep<d) ans[q]=-1;
    else ans[q]=path[deep-d];
    path[deep++]=q;
    for(int i=0;i<v[q].size();i++)
        dfs(v[q][i]);
    deep--;
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>d;
    for(int i=2;i<=n;i++)
    {
        int t;
        cin>>t;
        v[t].push_back(i);
    }
    deep=0;
    dfs(1);
    for(int i=1;i<=n;i++)
        cout<<ans[i]<<endl;
    return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值