どこでもZOJ第六シーズンH.singing浙江省

孟新しい新入生、多くの注目は、(ɔ³(⌣c)
初めてブログを書くことのためではなく、何をするか、あなたは兄免除します

どこH.Singing

アイデア:音声亀裂を減少させるために、そしてあなたがピーク(すなわち音声クラック)を削除しなければならないが、唯一の時点まで削除するので、1つまたは2つだけか、そのままを削減する場合、比較的無知開始、慎重な思考は、そのを見つけました、コードをノックここで考えることができ、ケースを低減することであるよう1919810のサンプル、2つの削除1〜9の間のこの時間として、二つの隣接する二つ等しいピーク後で彼の左を削除し、右側が新しいピークになることはありません、同じ状況がピークの左側と右側の番号を削除することです、それは新たなピークとなっているピークとピークを削除することで、状況を削減、削除しないに等しいです(私がAc期待していなかったら)良い分析コードをひっくり返します

#include<iostream>
#include<stdio.h>
#include<string>
#include<cstring>
#include<algorithm>
#include<math.h>
#include<stack>
#include<set>
#include<vector>
using namespace std;
double a[100005];
int main()
{
	int t;
	scanf("%d", &t);
	while (t--)
	{
		int n;
		scanf("%d", &n);
		int location[100005];
		int ans = 0;
		for (int i = 0; i < n; i++)
		{
			scanf("%lf", &a[i]);
			if (i>=2)
			{
				int j = i - 1;
				if (a[j]>a[j - 1] && a[j] > a[j + 1])
				{
					location[ans++] = j;
					//cout << "#" << location[ans - 1];
				}
			}
		}
		int t = ans;
		for (int i = 0; i < t; i++)
		{
			int tans = t;
			int t1 = t;
			int t2 = t;
			int pre = location[i];
			if (a[pre] == a[pre+2])
			{
				tans -= 2;
				ans = tans;
				//cout << "******\n";
				break;
			}
			if (a[pre - 1 - 1] < a[pre]){}
			else t1--;
			if (a[pre - 1] == a[pre + 1])
			{
				t2--;
			}
			else if (a[pre - 1]>a[pre + 1] && a[pre - 2]>a[pre-1])
			{
				t2--;
			}
			else if (a[pre - 1]<a[pre + 1] && a[pre + 2]>a[pre + 1])
			{
				t2--;
			}
			else{}
			tans = t1 < t2 ? t1 : t2;
			if (ans>tans)ans = tans;
		}
		cout << ans << "\n";
	}
	return 0;
}

公開された10元の記事 ウォンの賞賛6 ビュー1805

おすすめ

転載: blog.csdn.net/Kris_Kris/article/details/89643569