いがメモ

プログラミング関連についてやったことの記録を書いていきます。

バラライカ [1人おうちカクテル Advent Calendar 2016 10日目]

投稿する前に寝落ちしていた…。

この記事は 1人おうちカクテル Advent Calendar 10日目の記事です。

f:id:iga_c:20161211004323j:plain

名前:バラライカ
材料:ウオッカ 30ml、ホワイトキュラソー 15ml、レモンジュース 15ml
技法:シェーク

今日は3日目に作ったホワイトレディのベースをジンからウオッカに変えたカクテルを作りました。
ジンより味や匂いが無く、より飲みやすくなっています!
ジンがダメ人や柑橘系の味をより楽しみたい人はホワイトレディよりこちらをオススメします!

オレンジ・ブロッサム [1人おうちカクテル Advent Calendar 2016 9日目]

この記事は 1人おうちカクテル Advent Calendar 9日目の記事です。

f:id:iga_c:20161210012314j:plain

名前:オレンジ・ブロッサム
材料:ドライ・ジン 40ml、オレンジジュース 20ml
技法:シェーク

居酒屋でロングカクテルバージョン(ジン 1/4、オレンジジュース 3/4)を飲んだことがある人は結構いるのではないでしょうか?
元々はショートカクテルのオレンジブロッサムを今日は作りました。何日か前から見て頂いてる方がいたら分かると思いますが、オレンジジュースの消費が
ちょっと度数は高めになりますが、オレンジの味が効いていてあまり度数を感じなくて飲みやすさがあります。飲みすぎには気を付けましょう!

TopCoder SRM 609 Div1 Easy MagicalStringDiv1 [1人競技プログラミング Advent Calendar 2016 9日目]

この記事は1人競技プログラミング Advent Calendar 2016 9日目の記事です。

問題概要:
TopCoder Statistics - Problem Statement
修正前の呪文の文字列Sが与えられる。

がN個の後に<がN個続いている文字列が魔法の呪文となる。元の文字列から任意の箇所の文字を削除して魔法の呪文を作る必要がある。
作ることが出来る呪文の最大の長さを答えよ。

解いた方法:
文字列を適当な箇所で二分割し、左側にある>の個数と右側にある<の個数をカウントして少ない方*2が作れる呪文の長さになる。
全部列挙して試せばよい。

SRM 607 Div1Easy分からなかった…。

#include<bits/stdc++.h>

#define MP make_pair
#define PB push_back
#define ALL(x) (x).begin(),(x).end()
#define REP(i,n) for(int i=0;i<(n);i++)
#define REP1(i,n) for(int i=1;i<(n);i++)
#define REP2(i,d,n) for(int i=(d);i<(n);i++)
#define RREP(i,n) for(int i=(n);i>=0;i--)
#define CLR(a)      memset((a),0,sizeof(a))
#define MCLR(a)     memset((a),-1,sizeof(a))
#define RANGE(x,y,maxX,maxY) (0 <= (x) && 0 <= (y) && (x) < (maxX) && (y) < (maxY))

using namespace std;

typedef long long LL;
typedef unsigned long long ULL;
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef vector<string> VS;
typedef vector<LL> VLL;
typedef pair<int,int> PII;

const int INF = 0x3f3f3f3f;
const LL INFL = 0x3f3f3f3f3f3f3f3fLL;
const double EPS = 1e-9;

const int DX[]={1,0,-1,0},DY[]={0,-1,0,1};

class MagicalStringDiv1 {
    public:
    string S;
    int getLongest(string _SS) {
        S = _SS;

        int ans = 0;
        REP1(i, S.size()){
            int l=0, r=0;
            REP(j, i){
                l += S[j] == '>';
            }
            REP2(j, i, S.size()){
                r += S[j] == '<';
            }

            ans = max(ans, min(l, r) * 2);
        }
        return ans;
    }
};

TopCoder SRM 606 Div1 Easy EllysNumberGuessing [1人競技プログラミング Advent Calendar 2016 8日目]

この記事は1人競技プログラミング Advent Calendar 2016 8日目の記事です。

問題概要:
TopCoder Statistics - Problem Statement
Ellyが1~1,000,000,000までの間の1つの数を選択する。
Ellyに対してguesses[i]の数字を質問した際に、Ellyが考えている数の差分はanswers[i]であると返ってくる。
Ellyの考えている数の答えが一意に定まる場合はその数を返し、一意に定まらないけど複数の候補がある場合は-1を返し、解が存在しない場合は-2を返す。

解いた方法:
guesses[i] - answers[i]とguesses[i] + answers[i]を列挙し、len(guesses)個分ある数が
1個:答え
2個:-1
0個:-2
を返す。試すだけ。

#include<bits/stdc++.h>

#define MP make_pair
#define PB push_back
#define ALL(x) (x).begin(),(x).end()
#define REP(i,n) for(int i=0;i<(n);i++)
#define REP1(i,n) for(int i=1;i<(n);i++)
#define REP2(i,d,n) for(int i=(d);i<(n);i++)
#define RREP(i,n) for(int i=(n);i>=0;i--)
#define CLR(a)      memset((a),0,sizeof(a))
#define MCLR(a)     memset((a),-1,sizeof(a))
#define RANGE(x,y,maxX,maxY) (0 <= (x) && 0 <= (y) && (x) < (maxX) && (y) < (maxY))

using namespace std;

typedef long long LL;
typedef unsigned long long ULL;
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef vector<string> VS;
typedef vector<LL> VLL;
typedef pair<int,int> PII;

const int INF = 0x3f3f3f3f;
const LL INFL = 0x3f3f3f3f3f3f3f3fLL;
const double EPS = 1e-9;

const int DX[]={1,0,-1,0},DY[]={0,-1,0,1};

class EllysNumberGuessing {
    public:
    vector<int> guesses;
    vector<int> answers;
    int getNumber(vector<int> _guesses, vector<int> _answers) {
        guesses = _guesses, answers = _answers;
        map<int, int> memo;
        REP(i, guesses.size()){
            int l = guesses[i] - answers[i];
            if(0 < l){
                if(memo.count(l) == 0) memo.insert(MP(l, 1));
                else memo[l] += 1;
            }
            int u = guesses[i] + answers[i];
            if(u <= 1000000000){
                if(memo.count(u) == 0) memo.insert(MP(u, 1));
                else memo[u] += 1;
            }
        }

        int res = -2;
        for(auto x : memo){
            if(x.second == guesses.size()){
                if(res == -2) res = x.first;
                else return -1;
            }
        }

        return res;
    }
};

カシス・オレンジ [1人おうちカクテル Advent Calendar 2016 8日目]

この記事は 1人おうちカクテル Advent Calendar 8日目の記事です。

f:id:iga_c:20161208000834j:plain

名前:カシス・オレンジ
材料:クレーム・ド・カシス 1/4、オレンジジュース 3/4
技法:ビルド

飲んだことは無いという人は滅多にいないと思われる定番のカクテルです。
友達の家で人生初のお酒を飲んだのがこのカシオレで、カクテル美味しいな!となったきっかけの一杯です。本格的におうちカクテルやり始めたのはもっと後ですが…。
宅飲みでも作りやすく、(味の種類は少なくなりますが)缶を買うより安く沢山飲めるのでオススメです!(毎回オススメしてる気がする)

テキーラ・サンライズ [1人おうちカクテル Advent Calendar 2016 7日目]

この記事は 1人おうちカクテル Advent Calendar 7日目の記事です。

f:id:iga_c:20161207231522j:plain

名前:テキーラ・サンライズ
材料:テキーラ 45ml、オレンジジュース 適量、グレナデンシロップ 2tsp
技法:ビルド

グレナデンシロップを太陽に見立てて日の出をイメージしたカクテルです。
ちょっとお洒落な店にはメニューに載ってて飲んだことがある人もいるのではないでしょうか?
グラスの底の赤色が綺麗でテキーラも量が多くないのであまりきつくなく、テキーラベースを始めて飲むという方には是非飲んでみて貰いたいです!

TopCoder SRM 605 Div1 Easy AlienAndHamburgers [1人競技プログラミング Advent Calendar 2016 7日目]

この記事は1人競技プログラミング Advent Calendar 2016 7日目の記事です。

問題概要:
TopCoder Statistics - Problem Statement
i番目のハンバーガーの種類を表すtype配列とi番目の味のスコアを表すtaste配列が与えられる。 何個かのハンバーガーを食べて合計スコアを最大化したい。
スコアは 食べたハンバーガーの種類 * 食べたハンバーガーの味のスコアの合計で求められる。

解いた方法:
まず自明にtaste[i]が正の値の場合は重複している種類のハンバーガーでも必ず食べた方が最終スコアがお得になる。
負の値の場合は今までに食べたことがあるtypeのハンバーガーだと自明にスコアが下がるだけなので食べない。
また、食べたときに今までの合計スコアより結果が悪くなるなら食べない方がお得である。

taste[i]でソートしてtasteが大きい順番に食べていき食べたらスコアが下がるまで食べ続ければよい。

#include<bits/stdc++.h>

#define MP make_pair
#define PB push_back
#define ALL(x) (x).begin(),(x).end()
#define REP(i,n) for(int i=0;i<(n);i++)
#define REP1(i,n) for(int i=1;i<(n);i++)
#define REP2(i,d,n) for(int i=(d);i<(n);i++)
#define RREP(i,n) for(int i=(n);i>=0;i--)
#define CLR(a)      memset((a),0,sizeof(a))
#define MCLR(a)     memset((a),-1,sizeof(a))
#define RANGE(x,y,maxX,maxY) (0 <= (x) && 0 <= (y) && (x) < (maxX) && (y) < (maxY))

using namespace std;

typedef long long LL;
typedef unsigned long long ULL;
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef vector<string> VS;
typedef vector<LL> VLL;
typedef pair<int,int> PII;

const int INF = 0x3f3f3f3f;
const LL INFL = 0x3f3f3f3f3f3f3f3fLL;
const double EPS = 1e-9;

const int DX[]={1,0,-1,0},DY[]={0,-1,0,1};

class AlienAndHamburgers {
    public:
    vector<int> type;
    vector<int> taste;
    int getNumber(vector<int> _type, vector<int> _taste) {
        type = _type, taste = _taste;
        vector<PII> hamburgers;
        REP(i, type.size()){
            hamburgers.PB(MP(taste[i], type[i]));
        }
        sort(ALL(hamburgers), greater<PII>());

        set<int> use_types;
        int all_taste = 0;
        REP(i, hamburgers.size()){
            if(hamburgers[i].first >= 0){
                all_taste += hamburgers[i].first;
                use_types.insert(hamburgers[i].second);
            }else if(use_types.count( hamburgers[i].second ) == 0){
                int now_score = use_types.size() * all_taste;
                if(now_score < (int)(use_types.size()+1) * (all_taste + hamburgers[i].first)){
                    all_taste += hamburgers[i].first;
                    use_types.insert(hamburgers[i].second);
                }
            }
        }
        return use_types.size() * all_taste;
    }
};