夢追い人

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

原点回帰?

よく考えよう。
僕の合宿まであと一年もあるじゃないか。
合宿過去問はゆっくりとけばいい。
だから僕は本選に原点回帰する。

Books

今までにカンニングをさんざんしてきたので、解法を覚えてしまったので、やっぱり一発ACしないとダメですよね。
ローカルでテストしているときgeditの罠にはまっていました

#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int n,k;
vector<int> val[10];
int dp[2001];
int main() {
    scanf("%d%d",&n,&k);
    for (int i=0; i<n; i++) {
        int c, g; scanf("%d%d",&c,&g);
        val[g-1].push_back(c);
    }
    for (int i=0; i<10; i++) {
        sort(val[i].rbegin(),val[i].rend());
        for (int j=1; j<val[i].size(); j++) {
            val[i][j]+=val[i][j-1]+j*2;
        }
    }
    for (int i=0; i<10; i++) {
        if (val[i].size()!=0) {
            for (int j=k; j>0; j--) {
                for (int l=1; l<=min(j,(int)val[i].size()); l++) {
                    dp[j]=max(dp[j], dp[j-l]+val[i][l-1]);
                }
            }
        }
    }
    printf("%d\n",dp[k]);
}

1172

Twitterでつぶやかれていたので見てみたら簡単な素数問題だったから解いた

#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
bool isprime[1000001];
vector<int> prime;
int main() {
    fill(isprime, isprime+1000001, true);
    isprime[0]=isprime[1]=false;
    for (int i=2; i<1000001; i++) {
        if (isprime[i]) {
            prime.push_back(i);
            for (int j=i+i; j<1000001; j+=i) isprime[j]=false;
        }
    }
    int n;
    while (scanf("%d",&n)) {
        if (!n) break;
        printf("%d\n",upper_bound(prime.begin(),prime.end(),2*n)-upper_bound(prime.begin(),prime.end(),n));
    }
}

おしまい