読者です 読者をやめる 読者になる 読者になる

kyos1704活動記

適当に考えたことや調べたことを垂れ流すものです。質問等ありましたらtwitter:@kyos1704 に質問してください。

SRM566-div2-med-500

二色のペンギンで構成される輪が与えられる。
同じ色のペンギンを直線でむすび、結ぶ直線の本数の最大数を求める。
制約として、直線が交差しないという条件がある。

#include<iostream>
#include<vector>
#include<string>
#include<cstdio>
using namespace std;



class PenguinPals{
public:
	int findMaximumMatching(string colors){
		int ans=0;
		
		for(int i=1;i<colors.size();i++){
			if(colors[i-1]==colors[i]){
				ans++;
				colors.erase(i-1,2);
				i-=2;
				if(i<0)i=0;
			}
		}
		cout<<ans<<endl;
		cout<<colors<<endl;
		while((colors[0]==colors[colors.size()-1])&&(colors.size()!=1)){
			colors.erase(0,1);
			colors.erase(colors.size()-1,1);
			cout<<colors<<endl;
			ans++;
		}
		cout<<colors<<endl;
		ans+=colors.size()/2;
		if(colors.size()/2>0){
			ans--;
		}
		return ans;
	}
};

解法

隣り合ったペンギンを結んだ時に生じる直線は、
他の直線と交差することは絶対にないので、
①まず隣り合ったペンギンを結ぶ。
②結ばれたペンギンは他に影響しないので考えないで①を続ける

これらを行ったあと残るのは
色の違うペンギンが交互に並んだ輪であるので
[残りの人数-2]/2を足せば良い

最後残らなかったりした時にハマるのでそこは適宜修正