夢追い人

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

昆布精進、後もう少しでPC封印

半封印状態なんですけど。。。

なぜか精進以外のことでつかってたりするので今回の期末も気がかりです(;´Д`)

AOJ 0159

BMIには10000かけないといけないんですが・・あんまりはっきり書かれていない
いや、というか単位調整すればいいのかな?

#include <cstdio>
#include <cmath>
int main() 
{
    int i,h,w,n;
    while (scanf("%d",&n)&&n!=0) {
        int res=0;
        double mindiff=1000000.0;
        for (int j=0; j<n; j++) {
            scanf("%d %d %d",&i,&h,&w);
            double diff=22.0-(double)w/(h*h)*10000;
            if (diff<0) diff*=-1;
            if (diff<mindiff) {
                mindiff=diff;
                res=i;
            }
        }
        printf("%d\n",res);
    }
}

AOJ 0148

#include <cstdio>
int main()
{
    int n;
    while (scanf("%d",&n)!=EOF) {
        if (n%39==0) printf("3C39\n");
        else if (n%39<10) printf("3C0%d\n",n%39);
        else printf("3C%d\n",n%39);
    }
}

AOJ 0149

#include <cstdio>
int main()
{
    float left,right;
    int lA=0,rA=0,lB=0,rB=0,lC=0,rC=0,lD=0,rD=0;
    while (scanf("%f %f",&left,&right)!=EOF) {
        if (left<0.2) lD++;
        else if (left<0.6) lC++;
        else if (left<1.1) lB++;
        else lA++;
        if (right<0.2) rD++;
        else if (right<0.6) rC++;
        else if (right<1.1) rB++;
        else rA++;
    }
    printf("%d %d\n%d %d\n%d %d\n%d %d\n",lA,rA,lB,rB,lC,rC,lD,rD);
}

AOJ 0150

素数テーブル生成ゲーム

#include <cstdio>
using namespace std;
int main()
{
    int n;
    bool prime[10001];
    for (int i=0; i<=10000; i++) prime[i]=true;
    prime[0]=false;
    prime[1]=false;
    for (int i=2; i<=10000; i++) {
        if (!prime[i]) continue;
        for (int j=i+i;j<=10000; j+=i) prime[j]=false;
    }
    while (scanf("%d",&n)&&n!=0) {
        int p1=0, p2=0;
        for (int i=2; i+2<=n; i++) {
            if (!prime[i]) continue;
            if (prime[i]&&prime[i+2]) {
                p1=i;
                p2=i+2;
            }
        }
        printf("%d %d\n",p1,p2);
    }
}

PKU 2909

素数テーブルゲーム2

#include <cstdio>
int main()
{
	int n;
	int prime[50001];
	for(int i = 0; i <= 50000; i++)
		prime[i] = 1;
	prime[0] = 0; prime[1] = 0;
	for(int i = 2; i <= 50000; i++){
		if(!prime[i]) continue;
		for(int j = i + i; j <= 50000; j += i)
			prime[j] = 0;
	}
	while(scanf("%d\n", &n)&&n!=0){
		int cnt = 0;
		for(int i = 2; i <= n / 2; i++)
			if(prime[i] && prime[n - i])
				cnt++;
		printf("%d\n", cnt);
	}
	return 0;
}

AOJ 0056

素数テーブルゲーム3

#include <cstdio>
int main()
{
	int n;
	int prime[50001];
	for(int i = 0; i <= 50000; i++)
		prime[i] = 1;
	prime[0] = 0; prime[1] = 0;
	for(int i = 2; i <= 50000; i++){
		if(!prime[i]) continue;
		for(int j = i + i; j <= 50000; j += i)
			prime[j] = 0;
	}
	while(scanf("%d\n", &n)&&n!=0){
		int cnt = 0;
		for(int i = 2; i <= n / 2; i++)
			if(prime[i] && prime[n - i])
				cnt++;
		printf("%d\n", cnt);
	}
	return 0;
}

AOJ 0185

素数判定ゲーム。
なぜか0056より制約きついのに0056でTLEするコードで通る、謎

#include <cstdio>
#include <cmath>
using namespace std;
bool isprime(int n)
{
    for (int i=3; i*i<=n; i+=2) {
        if (n%i==0) return false;
    }
    return true;
}
int main()
{
    int n;
    while (scanf("%d",&n)&&n!=0) {
        int res=0;
        for (int i=3; i<=n/2; i+=2) if (isprime(i)&&isprime(n-i)) res++;
        printf("%d\n",res);
    }
}

PKU 3979

一回WAしていたのはどうやら分母が1の時の出力に分母を使っていたようだからであった・・・

#include <cstdio>
#include <cmath>
#include <iostream>
using namespace std;
int gcd(int a,int b)
{
    return b != 0 ? gcd(b, a%b) : a;
}
int main() 
{
    int a,b,c,d;
    char calc;
    while (scanf("%d/%d",&a,&b)!=EOF) {
        cin>>calc;
        scanf("%d/%d",&c,&d);
        int gd=gcd(b,d);
        int res1,res2=b*d/gd;
        a*=res2/b;
        c*=res2/d;
        if (calc=='+') res1=a+c;
        else if (calc=='-') res1=a-c;
        int tmp;
        if (res1<0) tmp=res1*-1;
        else tmp=res1;
        gd=gcd(tmp,res2);
        res1/=gd;
        res2/=gd;
        if (res1==0) printf("0\n");
        else if (res2==1) printf("%d\n",res1);
        else printf("%d/%d\n",res1,res2);
    }
}

PKU 3637

一回のレジで三つ買うとそのなかの一番安い商品を無料にしてくれる。
数個の商品を買おうとしたとき、割引が最大になるように買うとその割引額はいくらになるか?
貪欲法。
逆順ソートして上から3の倍数番目の商品が無料になると考えれば良い。

#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    for (int ix=0; ix<t; ix++) {
        int n;
        scanf("%d",&n);
        vector<int> doll(n);
        for (int i=0; i<n; i++) scanf("%d",&doll[i]);
        sort(doll.begin(), doll.end());
        if (doll.size()<3) {
            printf("0\n");
            continue;
        }
        reverse(doll.begin(), doll.end());
        int res=0;
        for (int i=2; i<doll.size(); i+=3) res+=doll[i];
        printf("%d\n",res);
    }
}

余談

ゴールドバッハ予想の問題を三問解いたのはご愛嬌。
0185と0056の差異はなんであるのか???

奇数っていってもどうせ弾くしなぁ…
制限時間も同じだったし…
(0056はちょっとカンニングしました)