Hatena::Grouptopcoder

Hiro180の日記

 | 

2013-08-07

SRM534&SRM402 00:40

今日(昨日?)はSRMを2setやりました

SRM 534

oo- 121.04,(295.92),0.0

416.96pts 63位相当


Easy:


ゲームの必勝法。

状態数が高々2^20なのでDPをする

バグる。

提出.121.04pts

終了後めっちゃ簡単に解けることが分かる。闇。

//E? Nandatte?
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <functional>
#include <iostream>
#include <map>
#include <set>
using namespace std;
typedef pair<int,int> P;
typedef pair<int,P> P1;
typedef pair<P,P> P2;
#define pu push
#define pb push_back
#define mp make_pair
#define eps 1e-7
#define INF 2000000000
int dp[(1<<20)]={};
class EllysCheckers{
public:
string getWinner(string board)
{
	dp[0]=-1;
	int n=board.size();
	for(int i=1;i<(1<<(n-1));i++)
	{
	bool used[25]={};
		for(int j=0;j<n-1;j++)
		{
			if(((i>>j) & 1))
			{
				used[j]=true;
			}
		}
		for(int j=0;j<n-1;j++)
		{
			if(!j && used[j])
			{
				if(dp[i-1]==-1) {dp[i]=1; goto end;}
			}
			else if(j==2 && used[j])
			{
				if(dp[i-4]==-1) {dp[i]=1; goto end;}
				if(!used[j-1] && dp[i-2]==-1 ) {dp[i]=1; goto end;}
			}
			else if(used[j])
			{
				if(j!=1){ if(dp[i-(1<<(j-3))*7]==-1 && !used[j-3]) {dp[i]=1; goto end;}}
				if(dp[i-(1<<(j-1))]==-1 && !used[j-1]) {dp[i]=1; goto end;}
			}
		}
		dp[i]=-1;
		end:;
	}
	reverse(board.begin(),board.end());
	int nest=0;
	for(int i=1;i<board.size();i++)
	{
		nest+=board[i]=='o'?(1<<(i-1)):0;
	}
	return dp[nest]==1?"YES":"NO";
}
};

Med

昔解いていた。

なんかbitDPしないといけないみたいなんだけど

mapをつかってゆるふわ~とDPしたら通る

//E? Nandatte?
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <functional>
#include <iostream>
#include <map>
#include <set>
using namespace std;
#define pb push_back
long long gcd(long long a,long long b)
{
	if(a<b) swap(a,b);
	if(a%b==0) return b;
	else return gcd(b,a%b);
}
class EllysNumbers
{
	public:
	long long getSubsets(long long n,vector<string> special)
	{
		vector<long long>sp;
		string all="";
		for(int i=0;i<(int)special.size();i++)
		{
			all+=special[i];
		}
		long long int cur=0;
		for(int i=0;i<all.size();i++)
		{
			if(all[i]==' ')
			{
				sp.push_back(cur);
				cur=0;
				continue;
			}
			cur*=10ll;
			cur+=all[i]-'0';
		}
		if(cur)
		{
			sp.pb(cur);
			cur=0ll;
		}
		sort(sp.begin(),sp.end());
		vector<long long> ele;
		bool chance=0;
		for(int i=0;i<sp.size();i++)
		{
		cout << sp[i] << endl;
			if(n % sp[i] == 0)
			{
				long long e=n/sp[i];
				if(gcd(sp[i],e) == 1)
				{
					ele.pb(sp[i]);
					if(sp[i]==1) chance=1;
				}
			}
		}
		map<long long,long long>m;
		m[1]=1;
		for(int i=0;i<ele.size();i++)
		{
			map<long long,long long>::iterator it;
			for(it=m.begin();it!=m.end();++it)
			{
				long long se=n/(it->first);
				if(se%ele[i]==0)
				{
					m[(it->first)*ele[i]]+=it->second;
				}
			}
		}
		return m[n];
	}
};

SRM 402

x-- 0.00,0.00,0.00

0.00pts hoge位相当

本番だったら1772->72(-1700)

easy:

サイズが8なので普通にやればいい。

再帰を使うと割とらくに書ける。

メモ化わすれてTLE.楽しい!!✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌

//E? Nandatte?
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <functional>
#include <iostream>
#include <map>
#include <set>
using namespace std;
typedef pair<int,int> P;
typedef pair<int,P> P1;
typedef pair<P,P> P2;
#define pu push
#define pb push_back
#define mp make_pair
#define eps 1e-7
#define INF 2000000000
map<vector<int>,double>ma;
double rec(vector<int>per,int depth)
{
double ret=0.0;
if(ma[per]>0.0) return ma[per];
int div=0;
	for(int i=0;i<per.size();i++)
	{
		for(int j=i+1;j<per.size();j++)
		{
			if(per[i]>per[j])
			{
				div++;
				swap(per[i],per[j]);
				double sub=rec(per,depth+1);
				ret+=sub;
				swap(per[i],per[j]);
			}
		}
	}
	if(!div) return 0.0;
	else return ma[per]=ret/div+1.0;
}
class RandomSort{
public:
double getExpected(vector <int> permutation)

{
	double p=rec(permutation,0);
	return p;
}
};

Med:

区間をもってひとつづつ消していって

つなげて並べて比較する。

読み間違えと実装力のなさのせいですごく時間がかかった><


//E? Nandatte?
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <functional>
#include <iostream>
#include <map>
#include <set>
using namespace std;
typedef pair<int,int> P;
typedef pair<P,int> P1;
typedef pair<P,P> P2;
#define pu push
#define pb push_back
#define mp make_pair
#define eps 1e-7
#define INF 2000000000
class LargestGap{
public:
int getLargest(vector <string> board)
{
	vector<P1>store;
	string all="";
	for(int i=0;i<board.size();i++) all+=board[i];
	char prev;
	int cur=0;
	vector<P>prs;
int fss=0;
	if(all[0]==all[all.size()-1]) fss=1;
	P1 res;
	for(int i=0;i<all.size();i++)
	{
		if(!i)
		{
				prev=all[i];
				cur++;
		}
		else if(prev!=all[i])
		{
		if(fss)
		{
			if(prev=='X') res=(mp(mp(cur,0),i-cur));
			else res=(mp(mp(cur,1),i-cur));
			fss--;
			goto fil;
		}
			if(prev=='X') store.pb(mp(mp(cur,0),i-cur));
			else store.pb(mp(mp(cur,1),i-cur));
			
			fil:;
			prev=all[i];
			cur=1;
		}
		else
		{
			cur++;
		}
	}
	int m[2505];
	if(res.first.first)
	{
			if(prev=='X') store.pb(mp(mp(cur+res.first.first,0),0));
			else  store.pb(mp(mp(cur+res.first.first,1),0));
	}
	else
	{
			if(prev=='X')  store.pb(mp(mp(cur,0),all.size()-cur));
			else  store.pb(mp(mp(cur,1),all.size()-cur));
	}
	int c=0;
	int s=0;
	vector<int>pri;
	vector<int>nowbest,hok;
	for(int i=0;i<store.size();i++)
	{
	cout << store[i].first.first << " " <<store[i].first.second << " " << store[i].second <<endl;
		if(store[i].first.second) { prs.pb(mp(store[i].first.first,s));pri.pb(store[i].first.first); }
		s+=store[i].first.first;
	}
	sort(pri.begin(),pri.end(),greater<int>());
	int bestidx=INF;
	int rui=0;
	for(int i=0;i<store.size();i++)
	{
	rui+=store[i].first.first;
		if(store[i].first.second) continue;
		
		int p=store[(i+store.size()-1)%store.size()].first.first;
		int q=store[(i+store.size()+1)%store.size()].first.first;
		vector<int>now;
		int a=0,b=0,c=0;
		for(int ii=0;ii<pri.size();ii++)
		{
			
			if(!a && pri[ii]==p){a=1; continue;}
			if(!b && pri[ii]==q){b=1; continue;}
			if(pri[ii]<=p+q && !c)
			{
				now.pb(p+q);
				c=1;
				ii--;
				continue;
			}
			now.pb(pri[ii]);
		}
		if(!c) now.pb(p+q);
		cout << i << endl;
		for(int ii=0;ii<now.size();ii++) cout << now[ii] << " ";
		cout << endl;
		if(nowbest.empty()) { nowbest=now; bestidx=store[i].second;}
		else
		{
		bool winam=true,win=false;
			for(int ii=0;ii<nowbest.size();ii++)
			{	
				if(nowbest[ii]<now[ii]) { win=true; break;}
				else if(nowbest[ii]>now[ii]) { winam=false;break;}
			}
			if(win) { nowbest=now;  bestidx=store[i].second;}
			else if(winam) bestidx=min(store[i].second,bestidx);
		}
	}
	
	return bestidx;
	}
};

まとめ:探索&実装ゲー得意になりたい

 |