文字変換とアルゴリズム問題集

文字変換問題

Ytfcは魔法の森で、文字列の大文字小文字を反転させる必要がある。この問題を解決するプログラムを作成せよ。

入力: 複数の文字列が与えられる。各文字列の長さは1から200の間である。

出力: 各文字列に対して、大文字小文字を反転させた結果を出力する。

#include<stdio.h>
char str[205];
int main(){
    while(scanf("%s",str)!=EOF){
        for(int i=0;str[i]!='\0';i++){
            if(str[i]>='A'&&str[i]<='Z'){
                str[i]=str[i]-'A'+'a';
            }
            else if(str[i]>='a'&&str[i]<='z'){
                str[i]=str[i]-'a'+'A';
            }
        }
        printf("%s\n",str);
    }
    return 0;
}

ランチ選択問題

XPは予算内で最大の体力値を得るための料理を選ぶ必要がある。

入力: 複数のケースが与えられる。最初の行に予算Mと料理の種類N。その後N行にそれぞれ料理の価格と体力値が記載されている。

出力: 最大の体力値を出力する。

#include<stdio.h>
int dp[1001][21], v[21], w[21];
int max(int a, int b){return a>b?a:b;}
int main(){
    int m,n;
    while(scanf("%d%d",&m,&n)!=EOF){
        for(int i=1;i<=n;i++)scanf("%d%d",&v[i],&w[i]);
        for(int i=0;i<=m;i++)for(int j=0;j<=n;j++)dp[i][j]=0;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++){
                if(j>=v[i])dp[j][i]=max(dp[j][i-1],dp[j-v[i]][i-1]+w[i]);
                else dp[j][i]=dp[j][i-1];
            }
        printf("%d\n",dp[m][n]);
    }
    return 0;
}

電灯問題

N個の電灯があり、K人の学生がスイッチを操作する。最終的に点灯している電灯の数を計算する。

#include<stdio.h>
int main(){
    int n,k;
    while(scanf("%d%d",&n,&k)!=EOF){
        int light[1001]={0};
        for(int i=1;i<=n;i++)
            for(int j=1;j<=k&&j<=i;j++)
                if(i%j==0)light[i]=!light[i];
        int count=0;
        for(int i=1;i<=n;i++)if(light[i])count++;
        printf("%d\n",count);
    }
    return 0;
}

宝探し問題

XPは宝庫の中を移動しながら最大の財宝を得るルートを探す。

#include<stdio.h>
int main(){
    int grid[21][21], n;
    while(scanf("%d",&n)!=EOF){
        for(int i=0;i<n;i++)for(int j=0;j<n;j++)scanf("%d",&grid[i][j]);
        for(int i=1;i<n;i++)grid[0][i]+=grid[0][i-1],grid[i][0]+=grid[i-1][0];
        for(int i=1;i<n;i++)for(int j=1;j<n;j++)grid[i][j]+=grid[i-1][j]>grid[i][j-1]?grid[i-1][j]:grid[i][j-1];
        printf("%d\n",grid[n-1][n-1]);
    }
    return 0;
}

円の面積問題

二つの小さい円の面積から、その間に存在する緑色部分の面積を計算する。

#include<stdio.h>
#include<math.h>
int main(){
    double area1,area2;
    while(scanf("%lf%lf",&area1,&area2)!=EOF){
        double r1=sqrt(area1/M_PI), r2=sqrt(area2/M_PI);
        printf("%.3lf\n",(r1*r1+r2*r2)*M_PI);
    }
    return 0;
}

タグ: C言語 アルゴリズム 競技プログラミング

7月12日 18:31 投稿