kyos1704活動記

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

立命館合宿一日目! ( rupc 2013 Day1 )

今日は
まーす(@__math)さん
___じょにえる(@___Johniel)さん

とチームを組みました
チーム名:_____kyos

チームらしい動きをしたのは初めてのことで
とても楽しかったです。
(じょにえるさんにほとんど手伝ってもらってましたが・・・)

~~~~流れ~~~

私がまずA問題、まーすさんがB、じょにえるさんがCを読む

A問題がぱっと解法がわからなかったので、
PCをまーすさんにパスして、
じょにえるさんとAをうごうごする

まーすさんがBバグってるっぽいので
一回交代してAをどうにかする
バグ→交代→バグ→交代→AC(A)→AC(B)

この時点で約50分経過

この時点でヤバい人たちがCに手を付けてない感じがしたので
CをパスしてDEを先に解くことに

Dをまーすさん
Eを私とじょにえるさんでうごうご

Eは(私は半分ぐらいしか理解してない)コードを
じょにえるさんに言われるままにうごうご書いていく

なんか通った

Dをまーすさんがうごうごしている間に
他の問題を読んで方針が立つかを考える

Gがなんとかなりそう・・・?

この時点でDが通るか通らないかで残り時間が30分

Dを通すことに集中して
あまりでGをやることに

最後バグってしまって、コード印刷してみてみる事にしたら
印刷したコードが届く前に原因がわかる

つぶしてAC

Gをうごうごするが間に合わず

で 4完でした

~~~~~~~~~~~


~~~反省~~~~~

一番どうにかすべきなのはインデックスが0-baseか1-baseなのか
統一したほうが良いということ

今まで適当だったけど0-baseに変えよう

あとじょにえるさんがさすがというか
チームでの動きになれてらっしゃった

うちではチームで動けてないので
そういう練習というか
チームでうごうごする機会が必要だなぁと思った


あとリーダブルコードよんでバグ取りやすいコード書こう・・・・



あと終わった後の懇親会で思ったこと

いろんなデータ構造やら
アルゴリズムやら
コピペにしたって自分で理解した分と

自分で頑張って実装して
再利用できそうな分

ライブラリにして整理するって作業をしておくと
自分が何ができて何ができないのかよくわかっていい気がした

ライブラリ見ないとわからないのか
ライブラリから削除しても空で書けるのかとか
結構重要な気がする
(そもそもライブラリ今無いけど)

Ubuntu を USB に突っ込んでみる

http://shiroichi.sakura.ne.jp/2012/11/20121104ubuntu/

ここを参考に

家とか外とかで作業する環境がよく変わるので
これでどうにかできないかなと思ってる

どうにかなるのかしら・・・・

まあどちらにせよlinuxさんには触りたいので
お勉強かな


PS
何回かやり直したけど起動しない
またこんどやってみる

SRM 572 - med - 500

問題

文字をずらして
目的の文字列に変形する
変形にはコストがかかるので
そのコストの最小値を求める

不可能なときは-1を返す


変換規則
char++ or char--
'a-z'の範囲内で移動
文字列中の同じ文字が一度に移動する

#include <string> 
#include <vector>
#include<deque>
#include<stack>
#include<queue>
#include<cmath>
#include<utility>
#include<iostream>
using namespace std;


class NextOrPrev {
	public:
	bool J(string s, string g){
		int size=s.size();
		for(int i=0;i<size;i++){
			for(int j=0;j<size;j++){
				if(i!=j && (( (s[i]<s[j]&&g[i]<g[j])||(s[i]>s[j]&&g[i]>g[j]) ) == false ) ){
					cout<<i<<" "<<j<<endl;
					return false;
				}
			}
		}
		return true;
	}
	int ANS(int nextCost, int prevCost, string start, string goal){
		int ans=0;
		for(int i=0;i<start.size();i++){
			while(start[i]!=goal[i]){
				if(start[i]<goal[i]){
					start[i]++;
					ans+=nextCost;
				}else if(start[i]>goal[i]){
					start[i]--;
					ans+=prevCost;
				}
			}
		}
		return ans;
	}
	int getMinimum(int nextCost, int prevCost, string s, string g) {
		if(J(s,g)){
			return ANS(nextCost,prevCost,s,g);
		}else{
			return -1;
		}
	}
};


解法

この変換規則において変換可能なときは
変形時に同じ文字が出現しなければよい

s[i]→s[j]
g[i]→g[j]
の→が両方一致するとき可能

可能じゃない時を弾きたいのでfalse

あとはできることがわかっているので
一個ずつ足してやれば良い

SRM 572 - easy - 250

問題

与えられた数字を全てかけた時に
正 負 0
のどれになるかを返す

#include <string>
#include <vector>
#include<deque>
#include<stack>
#include<queue>
#include<cmath>
#include<utility>
#include<iostream>
using namespace std;


class EasyHomework {
	public:

	string determineSign(vector <int> A) {
		int neg=0;
		int size=A.size();
		for(int i=0;i<size;i++){
			if(A[i]==0){
				neg=-1;
				break;
			}else if(A[i]<0){
				neg++;
			}
		}
		cout<<neg<<endl;
		if(neg==-1){
			return "ZERO";
		}else if(neg%2==0){
			return "POSITIVE";
		}else{
			return "NEGATIVE";
		}
	}
};


解法
負の要素を数えて偶数かどうかを調べる
途中に0があったら0

SRM 571 - easy - 250

読んでない
通った

#include<iostream>
#include<vector>
#include<string>
#include<stack>
#include<queue>
#include<cmath>
#include<cstdio>
#include<map>
#include<set>
#include<algorithm>
using namespace std;

class FoxAndGame {
	public:
	int countStars(vector <string> result) {
		int ans=0;
		int sizei=result.size(),sizej;
		for(int i=0;i<sizei;i++){
			sizej=result[i].size();
			for(int j=0;j<sizej;j++){
				if(result[i][j]=='o'){
					ans++;
				}
			}
		}
		
		return ans;
	}
};


'o'を数えるだけ

SRM570 - div2 - hard - 1000

組み合わせの数を求める問題

A社はケーブル持ってて
B社はケーブル持ってないので

B社がなんとかなる組み合わせ(ケーブルがつながってる組み合わせ)
の数を数える

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




class CentaurCompanyDiv2{
private:
	bool conect[60][60];
	long long dp[60];
	int N;
	bool vis[60];
	vector<int> sort;
public:
	long long dfs(int x){
		vis[x]=1;
		if(dp[x]!=-1){
			return dp[x];
		}
		long long res=1;
		for(int i=0;i<N;i++){
			if(vis[i]==0 && conect[x][i]==1){
				res*=(dfs(i)+1);
				if(res==0){
					cout<<"hogehoge"<<x<<i<<endl;
				}
			}
		}
		if(res==0){
			cout<<"hogee"<<endl;
		}
		dp[x]=res;
		
		cout<<x<<" "<<dp[x]<<endl;
		return res;
	}
	long long count(vector <int> a, vector <int> b){
		long long ans=1;
		for(int i=0;i<60;i++){
			dp[i]=-1;
			for(int j=0;j<60;j++){
				conect[i][j]=0;
			}
		}
		N=a.size()+1;
		for(int i=0;i<N-1;i++){
			conect[a[i]-1][b[i]-1]=1;
			conect[b[i]-1][a[i]-1]=1;
		}
		for(int i=0;i<N;i++){
			vis[i]=0;
		}
		dfs(0);
		for(int i=0;i<N;i++){
			ans+=dp[i];
		}
		return ans;
	}
};


ケーブル接続が木になっている
(木:ループがないグラフ)

各ノード毎にdpを行う
木dpってのになるっぽい

各ノード以下の木でできる組み合わせの数を保持させる
(枝の長さ*枝の長さ)*枝の長さ・・・・
みたいな感じ

深さ優先探索しながらDPして
dpで保持した値を全部足す+[B社がなにも持ってないパターンの1]
が答え