忍者ブログ
23 December

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

09 January

SRM603 div2 medium

問題文

http://community.topcoder.com/stat?c=problem_statement&pm=12939

要素数がNの配列Aがある。その中からN/2個のペアを作る。
そのペアの中で積がX以上になる個数を求めよ。
なお、Xは負の数であることが保証されている。

解法

最初、A中に負の数の個数が何個あるか求めてから
個数が奇数か偶数かとかで場合分けしようとしたが、
ソートしてから、前から二個ずつペアにしていき、
その積がXを超えている個数をカウントしていけば解けることに途中で気づいた。
the productの意味を積だと知らず、少し手間取った。
英語は大事。



#include<iostream>
#include<vector>
#include<map>
#include<functional>
#include<algorithm>
#include<string>
#include<climits>

using namespace std;

class SplitIntoPairs{
public:
	int makepairs(vector<int> A,int X){
		sort(A.begin(),A.end());
		int cnt=0;
		for(int i=0;i<A.size()-1;i+=2)
			if((long long)A[i]*A[i+1] >= X)cnt++;
		return cnt;
	}
};

PR
09 January

SRM603 div2 easy

問題文


http://community.topcoder.com/stat?c=problem_statement&pm=12940

文字列"s"が与えられる。
・文字列の長さが奇数の時、その"s"の真ん中の文字を"t"の末尾に加え、"s"からは消す。
・文字列の長さが偶数の時、その"s"の真ん中の2つの文字の内小さい方を
"t"の末尾に加え、"s"からは消す。

この操作を"s"がなくなるまでやった時の"t"を返せ。


解法


指示された通りにコードを書いていけば大丈夫。
eraseとか使ってる時に、
コンパイルが1回で通るとビビるのを治したいw



#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
#include<functional>
#include<climits>
#include<string>

using namespace std;

class MiddleCode{
public:
	string encode(string s){
		string t;
		while(!s.empty()){
			if(s.size()%2 == 0){
				//even number
				if(s[s.size()/2-1]<s[s.size()/2]){
					t.push_back(s[s.size()/2-1]);
					s.erase(s.size()/2-1,1);
				}else{
					t.push_back(s[s.size()/2]);
					s.erase(s.size()/2,1);
				}
			}
			else{
				//odd number
				t.push_back(s[s.size()/2]);
				s.erase(s.size()/2,1);
			}
		}
		return t;
	}
};

31 December

SRM602 div2 easy

問題文


http://community.topcoder.com/stat?c=problem_statement&pm=12927

typocoderというコンテストではレーティングシステムがあって、
1200以上がbrownで、1200未満はcielと呼ばれる。
最初のレートが500の時、rating[]のようにレートが変化するとしたら、
何回brownとcielの間を移動したか返せ。


解法

普通に条件分けしてシミュレートしていったらできた。


#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
#include<string>

using namespace std;

class TypoCoderDiv2{
public:
	int count(vector  rating){
		bool c=true;
		int cnt=0;
		for(int i=0;i<rating.size();i++){
			if(i==0){
			if(rating[i] >= 1200){c=true;cnt++;}
			else c=false;
			}
			else{
			if(c){
				if(rating[i]<1200){c=false;cnt++;}
			}
			else if(c==false){
			if(rating[i]>=1200){c=true;cnt++;}
			}
			}
		}
		return cnt;
	}
};
23 December

SRM601 div2 easy

問題文

http://community.topcoder.com/stat?c=problem_statement&pm=12858

bags[]の要素はそれぞれマンダリンオレンジの個数を表している。
このうちK個のbagsを友達に配る。
できるだけ公平に配るときに、一番多い人と一番少ない人の差を求めよ。

解法

ソートしてK番先の要素との差出して、最小をとる。


#include<iostream>
#include<vector>
#include<map>
#include<string>
#include<climits>
#include<algorithm>

using namespace std;

class WinterAndMandarins{
public:
	int getNumber(vector <int> bags, int K){
	
		sort(bags.begin(),bags.end());
		int ret=INT_MAX;
		
		for(int i=0;i<=bags.size()-K;i++){
			ret = std::min(ret,bags[i+K-1]-bags[i]);
		}
		return ret;
	}
};

22 December

SRM600 div2 medium

問題文

http://community.topcoder.com/stat?c=problem_statement&pm=12890

numbersの要素をいくつかOR計算して、goalと一致させる。
goalと一致できないようにするにはnumbersの要素を何個
使わないようにすれば可能か。みたいな感じだと思う。



解法

どれを使えばgoalと一致させられるかは分かったけど、
それ以降が解けなかった。

torus711さんのによると
http://d.hatena.ne.jp/torus711/20131214/p3

解答みてからしばらく考えた結果ORを足し算で考えてたから
ずっと間違ってたっぽいw
一応写経



#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
#include<functional>
#include<climits>

using namespace std;

class ORSolitaireDiv2{
public:
	int getMinimum(vector <int> numbers, int goal){
		int cnt=INT_MAX;

			for(int i=0;i < (1<<numbers.size());i++){
				int num=0;
				for(int j=0; j < numbers.size();j++){
					if(!(i & 1<<j) && (goal|numbers[j]) == goal)
						num = num | numbers[j];
				}
				
				if(num != goal){
					int cnt1=0;
					for(int j=1; j < (1<<numbers.size());j=j<<1)
						if((i & j)) cnt1++;
					cnt = std::min(cnt,cnt1);
				}
			}
		return cnt;
	}
};


        
  • 1
  • 2
  • 3