夢追い人

"It takes a dreamer to make a dream come true."―Vincent Willem van Gogh

JOI前哨戦

JOI前哨戦といいつつまぁJOIerほとんど出てなかったんですがw

はい。やってきました。
超好成績でした

236.82 0.00 510.45 0.00 Room 1位 Division 14位
861 -> 1043 (+182)

うほ☆

Easy

ただ1を数えるだけwww

class P8XMatrixTransformation {
public:
   string solve( vector <string> original, vector <string> target ) {
    int onum = 0, tnum = 0;
    for (int i=0; i<original.size(); i++) for (int j=0; j<original[i].length(); j++) if (original[i][j]=='1') onum++;
    for (int i=0; i<target.size(); i++) for (int j=0; j<target[i].length(); j++) if (target[i][j]=='1') tnum++;
    if (onum==tnum) return "YES";
    else return "NO";
   }
};

Medium

グラフ構築問題。
無理〜

Hard

とりあえずコインの価値が大きいほうから貪欲でとっていき、
最後に枚数調整。

辞書順最小とかあった気がしてやばいな〜とおもってたけどなんだかんだで通りました^^;

class P8XCoinChangeAnother {
public:
   vector<long long> solve( int N, long long coins_sum, long long coins_count ) {
    vector<ll> score(N), res(N, 0), nul;
    score[0]=1;
    for (int i=1; i<score.size(); i++) score[i] = score[i-1]*2;
    ll rim = coins_count, t = coins_sum;
    for (int i=N-1; i>=0; i--) {
        if (score[i]<=t) {
            ll temp = t / score[i];
            res[i] = min(temp, rim);
            rim -= res[i];
            t -= res[i]*score[i];
        }
    }
    if (rim!=0) {
        for (int i=N-1; i>0; i--) if (res[i]!=0) {
            ll x = min(rim, res[i]);
            res[i] -= x;
            res[i-1] += x*2;
            rim -= x;
            if (rim==0) break;
        }
        if (rim!=0) return nul;
        else return res;
    }
    else if (t!=0) return nul;
    else return res;
   }
};

感想

Hardで貪欲はさすがになにか間違えてる気がしたw

こっから過去問

PlayGame

class PlayGame {
public:
   int saveCreatures( vector <int> you, vector <int> computer ) {
    sort(you.begin(), you.end(), greater<int>());
    sort(computer.begin(), computer.end(), greater<int>());
    int t=0, res=0;
    for (int i=0; i<you.size(); i++) {
        for (;t<computer.size();t++) {
            if (computer[t]<you[i]) {
                res += you[i];
                t++;
                break;
            }
        }
        if (t==computer.size()) break;
    }
    return res;
   }
};

StandInLine

class StandInLine {
public:
   vector <int> reconstruct( vector <int> left ) {
    vector<P> sold(left.size());
    vi res(left.size());
    for (int i=0; i<left.size(); i++) {
        sold[i].first=left[i];
        sold[i].second=i+1;
    }
    sort(sold.begin(), sold.end());
    for (int i=0; i<left.size(); i++) {
        int cnt=0;
        for (int j=i; j>=0; j--) if (sold[i].second<sold[j].second) cnt++;
        if (sold[i].first > cnt) {
            swap(sold[i], sold[i+1]);
            i--;
        } else if (sold[i].first < cnt) {
            swap(sold[i], sold[i-1]);
            i-=2;
        }
    }
    for (int i=0; i<left.size(); i++) res[i]=sold[i].second;
    return res;
   }
};