夢追い人

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

糞問回

こどふぉはReadforcesとかいろいろ言われてましたがつまり糞問回でした
Aで早解き成功させて1287->1350(+63)、スペシャリストという人権いただきました

AOJ 2216

やるだけ

#include <cstdio>
#include <cstring>
int res[3];
int main() {
    int a, b;
    while (scanf("%d%d",&a,&b)) {
        if (!a&&!b) break;
        int r=b-a;
        res[2]=r/1000;
        r%=1000;
        res[1]=r/500;
        r%=500;
        res[0]=r/100;
        for (int i=0; i<3; i++) printf("%d%c",res[i],i==2?'\n':' ');
    }
}

AOJ 2217

union-findのfindみたいな再帰使って書いた

#include <cstdio>
#include <cstring>
#include <set>
using namespace std;
struct P { int x, y; };
int n;
int cnt[100][100];
P map[100][100];
int dfs(int y, int x, int c) {
    if (cnt[x][y]!=-1&&cnt[x][y]!=c) return cnt[x][y];
    if (cnt[x][y]==c) return cnt[x][y];
    cnt[x][y]=c;
    return cnt[x][y]=dfs(map[x][y].x,map[x][y].y,cnt[x][y]);
}
int main() {
    while (scanf("%d",&n)) {
        if (!n) break;
        for (int i=0; i<n; i++) {
            for (int j=0; j<n; j++) scanf("%d%d",&map[i][j].x,&map[i][j].y);
        }
        memset(cnt,-1,sizeof(cnt));
        int x=0;
        set<int> res;
        for (int i=0; i<n; i++) {
            for (int j=0; j<n; j++) {
                if (cnt[i][j]==-1) {
                    cnt[i][j]=++x;
                    cnt[i][j]=dfs(map[i][j].x,map[i][j].y,cnt[i][j]);
                    res.insert(cnt[i][j]);
                }
            }
        }
        printf("%d\n",res.size());
    }
}

Snowflakes

折り紙使って遊びながらやってたら時間かかったw

class Snowflakes {
public:
    vector <string> flareOut( vector <string> snowflake ) {
        int sz=snowflake.size();
        vector<string> half(sz);
        vector<string> qual(sz,"");
        vector<string> res(sz*2);
        for (int i=0; i<sz; i++) {
            for (int j=0; j<snowflake[i].length(); j++) qual[i]+=snowflake[i][j];
            for (int j=i+1; j<sz; j++) qual[i]+=snowflake[j][i];
        }
        for (int i=0; i<sz; i++) {
            string rev=qual[i];
            reverse(rev.begin(),rev.end());
            half[i]=rev+qual[i];
        }
        for (int i=0; i<sz; i++) {
            res[i]=half[sz-1-i];
        }
        for (int i=sz; i<sz*2; i++) {
            res[i]=half[i-sz];
        }
        return res;
    }
};

VolumeDiscount

ナップサックの逆バージョン
逆にしたとき一回例外処理ミスって1WAとか

class VolumeDiscount {
public:
    int bestDeal( vector <string> priceList, int quantity ) {
        int sz=priceList.size(), q=quantity;
        int w[sz], p[sz];
        int dp[sz+1][q+1];
        // init
        for (int i=0; i<sz; i++) {
            fill(dp[i],dp[i]+q+1,inf);
            int j; string x="";
            for (j=0; j<priceList[i].length(); j++) {
                if (priceList[i][j]==' ') {
                    stringstream ss;
                    ss<<x; ss>>w[i]; x=""; j++;
                    break;
                }
                x+=priceList[i][j];
            }
            for (;j<priceList[i].length();j++) {
                x+=priceList[i][j];
            }
            stringstream ss;
            ss<<x; ss>>p[i];
        }
        fill(dp[sz],dp[sz]+q+1,inf);
        // end;
        dp[0][0]=0;
        for (int i=0; i<sz; i++) {
            for (int j=0; j<=q; j++) {
                if (j<w[i]) {
                    dp[i+1][j]=min(dp[i][j],p[i]);
                } else {
                    dp[i+1][j]=min(dp[i][j],dp[i+1][j-w[i]]+p[i]);
                }
            }
        }
        return dp[sz][q];
    }
};

DancingSentence

やるだけ

class DancingSentence {
public:
    string makeDancing( string sentence ) {
        bool flag=false;
        for (int i=0; i<sentence.length(); i++) {
            if (sentence[i]==' ') continue;
            if (flag) {
                sentence[i]=tolower(sentence[i]);
                flag=false;
            } else {
                sentence[i]=toupper(sentence[i]);
                flag=true;
            }
        }
        return sentence;
    }
};

AOJ 2205

やるだけ

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
typedef long long ll;
ll n, m;
int main() {
    while (cin>>n>>m) {
        if (!n) break;
        string key[n];
        ll score[n];
        for (int i=0; i<n; i++) {
            string str; cin>>str>>score[i];
            key[i]=str;
        }
        ll sum=0;
        for (int i=0; i<m; i++) {
            string str; cin>>str;
            for (int j=0; j<n; j++) {
                int k=0;
                while ((key[j][k]=='*'||key[j][k]==str[k])&&k<8) k++;
                if (k==8) {
                    sum+=score[j];
                    break;
                }
            }
        }
        cout<<sum<<endl;
    }
}

AOJ 0227

やるだけ

#include <cstdio>
#include <algorithm>
using namespace std;
bool comp(const int& a, const int& b) {
    return a>b;
}
int n, m;
int p[1000];
int main() {
    while (scanf("%d%d",&n,&m)) {
        if (!n&&!m) break;
        for (int i=0; i<n; i++) {
            scanf("%d",&p[i]);
        }
        sort(p,p+n,comp);
        for (int i=m-1; i<n; i+=m) {
            p[i]=0;
        }
        int res=0;
        for (int i=0; i<n; i++) {
            res+=p[i];
        }
        printf("%d\n",res);
    }
}

Codeforces A

やるだけ、早解き

#include <cstdio>
int main() {
    int n, x, y;
    scanf("%d%d%d",&n,&x,&y);
    int come=(n*y+99)/100;
    if (come>=x) printf("%d\n",come-x);
    else puts("0");
}

Codeforces B

糞問1
改行のみの行は特別な処理をしなくてはならない雰囲気を醸し出してて実はしなくてよかったらしい・・・
おい
正解コードはぬるみねらるさんのを参考に

#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
    string str;
    bool newline=true;
    while (getline(cin,str)) {
        int len=str.length();
        bool sharp=false;
        for (int i=0; i<len; i++) {
            if (str[i]!=' ') {
                if (str[i]=='#') sharp=true;
                break;
            }
        }
        if (sharp) {
            if (!newline) cout<<endl;
            cout<<str<<endl;
            newline=true;
        } else {
            for (int i=0; i<len; i++) {
                if (str[i]!=' ') cout<<str[i];
            }
            newline=false;
        }
    }
    if (!newline) cout<<endl;
}

Codeforces C

糞問2
なんたる物理ゲー
というか最初に正解方針を思いついていたらしいんだけど、追いつく条件とか色々考えてたら条件ごちゃごちゃつけくわえて結局WAコードになってたわけ
これまた他人のコードを参考に

#include <cstdio>
#include <cmath>
#include <climits>
#include <algorithm>
#define inf INT_MAX/2
using namespace std;
struct bus {
    double t, v;
    double cost, time;
};
bus bus[100000];
int main() {
    int n, a, d; scanf("%d%d%d",&n,&a,&d);
    double fastest=0.0;
    double x, y;
    for (int i=0; i<n; i++) {
        scanf("%lf%lf",&bus[i].t,&bus[i].v);
        x=(d-bus[i].v*bus[i].v/(2.0*a))/bus[i].v;  // 速度限界に到達する地点からゴールまでにかかる時間
        y=bus[i].t+(bus[i].v/a)+x;
        if (x<0) {                                  // 速度限界に達する前にゴール
            y=bus[i].t+sqrt(2.0*d/(double)a);
        }
        if (fastest<=y) fastest=y;
        printf("%.10f\n",fastest);
    }
}