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