文字変換問題
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;
}