TopCoderというのは、プログラミングコンテストの一種です。
レイティング(個人の総合得点のようなもの)は1057→1090になりました。
250でシステムテストに落ち、500を通しました。
以下、それぞれのコードです。
250
最小値と最大値が与えられ、その範囲内にある数字の中で、連続した9の数が最も多いもののうち、最大の数を返す関数を作れというもの。
例えば、1~100なら、99を返し、88~98なら98を返すというような感じです。自分の書いたコードは二つめの例で89を返してしまうのでダメでした。
最小値も最大値も1000000以下だったので、わざわざこんなコードを書かずに、順番に見ていけば良かったなと後悔しました。
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;
}
};
今度は全て正の数で構成された等差数列に対して、偶数の要素がなくなるまで偶数である要素を半分にしていったものを渡されたとき、もとの数列を復元しろというものです。数列はvectorで渡されました。これは何とかシステムテストを通過しました。
何をやっているかといいますと、端っこでない要素に対して、両隣に対して凹んでいたら2倍していき、最後に端の要素が条件にあうまで倍にしてくというものです。
#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では、もうちょっと慎重になれればなぁ、と思います。たいてい日本では夜遅くの開催のようなので、眠気に負けてあんまり参加できないのが残念です。