遍历,二叉树

P1229遍历问题

题意:找有一个儿子的节点个数(
题解:先序遍历中,如果A只有一个子树B,那么在先序遍历中A一定在B前,在后序遍历中B一定在A前,即关键点在于找前序中相邻的两个字符在后序中有没有翻转过来输出

#include
#include
#include
#include
using namespace std;
char a[10002],b[10002];//分别记录前序和后序 
int main()
{
            scanf("%s\n%s",&a,&b);
            int len=strlen(a),ans=1;
            for(int i=0;i<=len-2;i++)
                     for(int j=0;j<=len-1;j++)
                              if(b[j]==a[i]&&b[j-1]==a[i+1]) ans*=2;
            cout<<ans;
            return 0; 
}

P9947 [USACO20JAN] Photoshoot B

题意:给出一个n-1的序列b1,b2,b3到bn-1,求一个序列 a,使 ai + ai+1 = bi


题解:知晓a 序列中的任意一个值,我们就可以通过 b 序列来求出 a 序列的所有值。于是如果让 a1=1, 那么就可以顺利推出整个序列的值。然后就递推。

#include

using namespace std;

int n;
int a[1001];
int ans[1001];
map<int,bool> mp;

int main(){
	cin>>n;
	for(int i = 1; i < n; i ++ ){
		cin>>a[i];
	}
	for(int i = 1; i < a[1]; i ++ ){
		ans[1] = i;
		mp[i] = 1;
		for(int j = 2; j <= n; j ++ ){
			ans[j] = a[j-1] - ans[j-1];
			mp[ans[j]] = 1;
		}
		bool flag = 1;
		for(int j = 1; j <= n; j ++ ){
			if(!mp[j]){
				flag = 0;
				break;
			}
		}
		if(flag){
			for(int j = 1; j <= n; j ++ ){
				cout<<ans[j]<<" ";
			}
			return 0;
		}
		for(int j = 1; j <= n; j ++ ){
			mp[j] = 0;
		}
	}
}

累了,枝节MARKDOWN吧

[USACO24JAN] Majority Opinion B

题目描述

Farmer John 有一项重要的任务——弄清楚要为他的奶牛们购买什么类型的干草。

Farmer John 的 N N N 头奶牛( 2 ≤ N ≤ 1 0 5 2\le N\le 10^5 2N105)编号为 1 1 1 N N N,每头奶牛喜欢恰好一种类型的干草 h i h_i hi 1 ≤ h i ≤ N 1\le h_i\le N 1hiN)。他希望他的所有奶牛都喜欢同一种干草。

为了实现这一目标,Farmer John 可以主持焦点小组访谈。一次焦点小组访谈为让编号从 i i i j j j 的连续范围内的所有奶牛聚集在一起参加一次访谈。如果有一种干草是小组中超过一半的奶牛喜欢的,则此次焦点小组访谈结束后,所有奶牛最终都会喜欢这种干草。如果不存在这种类型的干草,那么奶牛们不会改变她们喜欢的干草类型。例如,在由 16 16 16 头奶牛组成的焦点小组访谈中,需要有其中 9 9 9 头或更多的奶牛具有相同的干草喜好,才能使其余奶牛改变其喜好以与之一致。

Farmer John 想知道哪些类型的干草有可能变为同时受到所有奶牛的喜爱。他一次只能主持一个焦点小组访谈,但为了使所有奶牛都喜欢同一类型的干草,他可以根据需要任意多次地主持焦点小组访谈。

提示

样例解释

在输入样例中,有 5 个测试用例。

在第一个测试用例中,仅可能使所有奶牛喜欢种类 2 2 2。FJ 可以通过主持一次所有奶牛的焦点小组访谈达到这一目的。

在第二个测试用例中,可以证明没有奶牛会改变她们喜爱的干草种类。

在第三个测试用例中,有可能使所有奶牛喜欢种类 1 1 1,可以通过主持三次焦点小组访谈达到这一目的——首先使奶牛 1 1 1 4 4 4 进行一次焦点小组访谈,随后使奶牛 1 1 1 5 5 5 进行一次焦点小组访谈,随后使奶牛 1 1 1 6 6 6 进行一次焦点小组访谈。以类似的逻辑,依次操作奶牛 3 3 3 6 6 6,随后是奶牛 2 2 2 6 6 6,随后是奶牛 1 1 1 6 6 6,我们可以使所有奶牛喜欢种类 2 2 2

在第四个测试用例中,有可能使所有奶牛喜欢种类 3 3 3,可以通过主持一次所有奶牛的焦点小组访谈达到这一目的。

在第五个测试用例中,可以证明没有奶牛会改变她们喜爱的干草种类。

题解:对每 3 只相邻的奶牛进行考虑。显然,只要任意三只相邻奶牛中,有两只奶牛干草喜好相同,这种喜好就能通过向外“扩散”的焦点小组访谈统一到所有奶牛。
#include
using namespace std;
int T,n,h[100005];
bool f[100005];
int main(){
	scanf("%d",&T);//操作次数
	while(T--){
		scanf("%d%d",&n,&h[1]);
		for(int i=2;i<=n;i++){
			scanf("%d",&h[i]);
			if(!f[h[i]]&&(h[i]==h[i-1]||h[i]==h[i-2]))
				f[h[i]]=true;
		}bool flag=true;//用于判断是否无解 
		for(int i=1;i<=n;i++)
			if(f[i])printf("%d ",i),f[i]=flag=false;
		if(flag)printf("-1");//无解时,输出-1
		putchar('\n');
	}
return 0;
}

你可能感兴趣的:(算法,数据结构,图论)