P9077 [PA2018] Poddrzewo 题解

思考

感觉题目有点迷惑的意思,要最小化操作 \(1\) 使用的次数,也就是要节约修改操作,让我们认为操作 \(1\) 是最有用的,其实只要稍微动动脑子想一想,删除操作才是最有用的,而交换操作根本没用。

当将序列删除到只剩两个点时,就把两个点连上,度都为 \(1\)

所以如果序列中 \(1\) 的数量超过了 \(2\) 或相等,就可以根本不用修改操作,删除到序列中只剩下两个 \(1\) 为止,而如果数量小于 \(2\),那么直接输出 \(2\) 减去 \(1\) 的数量就好了。

总结一下:

  1. 如果 \(1\) 数量大于等于 \(2\),那么输出 \(0\)
  2. 如果 \(1\) 数量小于 \(2\),那么输出 \(0\)

Code

#include <bits/stdc++.h>
using namespace std;
int a[1000005];
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n;
	cin>>n;
	int ans=0;//1的数量
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		if(a[i]==1)
		{
			ans++;//如果为1就++
		}
	}
	cout<<max(0,2-ans)<<endl;//核心代码,也可以用下面的代码
	/*
	if(ans>=2)
	{
		cout<<0<<endl;
	}
	else
	{
		cout<<2-ans<<endl;
	}
	*/
	cout<<2<<endl;
	cout<<1<<" "<<2;
	return 0;
}
posted @ 2024-03-18 22:19  BadBadBad__AK  阅读(48)  评论(0)    收藏  举报