TocCode SRM485 参戦記

アバター
五反田
記事: 21
登録日時: 15年前
住所: 千葉

TocCode SRM485 参戦記

投稿記事 by 五反田 » 14年前

参戦してきました。2回目です。

TopCoderというのは、プログラミングコンテストの一種です。
レイティング(個人の総合得点のようなもの)は1057→1090になりました。

250でシステムテストに落ち、500を通しました。
以下、それぞれのコードです。

250
最小値と最大値が与えられ、その範囲内にある数字の中で、連続した9の数が最も多いもののうち、最大の数を返す関数を作れというもの。

例えば、1~100なら、99を返し、88~98なら98を返すというような感じです。自分の書いたコードは二つめの例で89を返してしまうのでダメでした。
最小値も最大値も1000000以下だったので、わざわざこんなコードを書かずに、順番に見ていけば良かったなと後悔しました。

CODE:

class MicrowaveSelling{
	public:
	int mostAttractivePrice(int minPrice, int maxPrice){
		int i=1;
		while(i0;k/=10){
			int t=(maxPrice+1)/k*k-1;
			if(t>=minPrice)return t;
			if(t==-1)return minPrice;
		}
		return minPrice;
	}
};
500
今度は全て正の数で構成された等差数列に対して、偶数の要素がなくなるまで偶数である要素を半分にしていったものを渡されたとき、もとの数列を復元しろというものです。数列はvectorで渡されました。これは何とかシステムテストを通過しました。

何をやっているかといいますと、端っこでない要素に対して、両隣に対して凹んでいたら2倍していき、最後に端の要素が条件にあうまで倍にしてくというものです。

CODE:

#include
using namespace std;

class AfraidOfEven{
	public:
	vector  restoreProgression(vector  seq){
		int flag=1;
		vector::iterator p;
		int size=seq.size();
		while(flag){
			flag=0;
	
			for(int i=1;i<size-1;i++){
				if(seq[i]-seq[i-1]<seq[i+1]-seq[i]){
					seq[i]*=2;
					flag++;
				}	
			}
		}
		while(seq[1]-seq[0]!=seq[2]-seq[1])seq[0]*=2;
		while(seq[size-1]-seq[size-2]!=seq[size-2]-seq[size-3])seq[size-1]*=2;
		
		return seq;
	}
};
最後の問題は、読んで考えている間に終わってしまいました。
次のRoundでは、もうちょっと慎重になれればなぁ、と思います。たいてい日本では夜遅くの開催のようなので、眠気に負けてあんまり参加できないのが残念です。

アバター
あーる@Reputeless
記事: 84
登録日時: 15年前

Re: TocCode SRM485 参戦記

投稿記事 by あーる@Reputeless » 14年前

むむむ、わりと難しそう(´ω`;

アバター
五反田
記事: 21
登録日時: 15年前
住所: 千葉

Re: TocCode SRM485 参戦記

投稿記事 by 五反田 » 14年前

>>あーるさん
それを考えるのが、なかなか面白いんですよ。

ゲーム作成とはかなり方向性が違いますけど、条件分岐とか繰り返しや配列まで分かっていれば殆ど問題ないし、頭の体操とか、アルゴリズムの勉強になります。