夢追い人

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

基礎勉強に勤しんでるにゃん

ツイートに流れる部分はにゃんしばり続けたほうがいいかなって思って・・・

PKU 3169

結局あり本の解説ガン見してた。
普通に難しい・・・

#include <cstdio>
#include <climits>
#include <algorithm>
#define inf INT_MAX/2
using namespace std;
int d[1000];
int n,ml,md;
int al[10000], bl[10000], dl[10000];
int ad[10000], bd[10000], dd[10000];
int main() {
    scanf("%d%d%d",&n,&ml,&md);
    fill(d, d+n, inf);
    d[0]=0;
    for (int i=0; i<ml; i++) {
        scanf("%d%d%d",&al[i],&bl[i],&dl[i]);
    }
    for (int i=0; i<md; i++) {
        scanf("%d%d%d",&ad[i],&bd[i],&dd[i]);
    }
    for (int k=0; k<n; k++) {
        for (int i=0; i+1<n; i++) {
            if (d[i+1]<inf) d[i]=min(d[i], d[i+1]);
        }
        for (int i=0; i<ml; i++) {
            if (d[al[i]-1]<inf) {
                d[bl[i]-1]=min(d[bl[i]-1],d[al[i]-1]+dl[i]);
            }
        }
        for (int i=0; i<md; i++) {
            if (d[bd[i]-1]<inf) {
                d[ad[i]-1]=min(d[ad[i]-1],d[bd[i]-1]-dd[i]);
            }
        }
    }
    int res=d[n-1];
    if (d[0]<0) {
        res=-1;
    } else if (res==inf) {
        res=-2;
    }
    printf("%d\n",res);
}

PKU 1064

全部からlを抜き出さなければとかいみわかんない制約つけてしまって1WA

#include <cstdio>
#include <cmath>
using namespace std;
int n, k;
double l[10000];
bool C(double x) {
    int cnt=0;
    for (int i=0; i<n; i++) {
        cnt+=int(l[i]/x);
    }
    return cnt>=k;
}
int main() {
    scanf("%d%d",&n,&k);
    for (int i=0; i<n; i++) scanf("%lf",&l[i]);
    double lb=0.0, ub=100001.0;
    for (int i=0; i<100; i++) {
        double mid=(lb+ub)/2;
        if (C(mid)) {
            lb=mid;
        } else {
            ub=mid;
        }
    }
    printf("%.2f\n",floor(ub*100)/100);
}

AOJ 0563

真ん中のとり方わかんなかった・・・
kagamizさんのみてなるほどなーって書いたorz

#include <cstdio>
#include <cmath>
#include <climits>
#include <algorithm>
using namespace std;
typedef long long ll;
struct elem {
    ll x, y;
};
int w, h, n;
elem e[100000];
ll x[100000], y[100000];
ll px[3], py[3];
int main() {
    scanf("%d%d%d",&w,&h,&n);
    for (int i=0; i<n; i++) {
        scanf("%lld%lld",&x[i],&y[i]);
        e[i]=(elem){x[i],y[i]};
    }
    sort(x, x+n);
    sort(y, y+n);
    px[0]=x[(n-1)/2];
    px[1]=x[(n+1)/2];
    py[0]=y[(n-1)/2];
    py[1]=y[(n+1)/2];
    ll res=LLONG_MAX, rx=0, ry=0;
    for (int i=0; i<2; i++) {
        for (int j=0; j<2; j++) {
            ll calc=0, m=0;
            for (int k=0; k<n; k++) {
                ll temp=(abs(px[i]-e[k].x)+abs(py[j]-e[k].y));
                m=max(m, temp);
                calc+=temp;
            }
            if (res>calc*2-m) {
                res=calc*2-m;
                rx=px[i]; ry=py[j];
            }
        }
    }
    printf("%lld\n%lld %lld\n",res,rx,ry);
}