2024年12月30日月曜日

その他のA問題(ABC211-220)

単純計算

ABC211-A

問題概要

与えられた整数a,bに対し、実数 (A−B)/3+B を計算せよ。

解答

#n=gets.chomp.to_i
a,b=gets.chomp.split(" ").map(&:to_i)
ans=(a+2*b)/3.0
puts ans
    

上がコンテスト中に提出したコード。(2021-07-24 21:05:33)

Cで書いたコードが以下。(2024-05-22 22:46:09)

int readint(char *s);
#include<stdio.h>
#include<stdlib.h>
#define N1 8
int main(void){
    char* s1=(char*)malloc(sizeof(char)*N1);
    if (s1==NULL){
        printf("memory allocation to s1 failed.\n");
        exit(1);
    }
    char *ts1=fgets(s1,N1,stdin);
    if(ts1==NULL){
        printf("fgets(s1) failed\n");
        exit(1);
    }
    int i=0;
    int a=readint(s1+i);
    while(*(s1+i)!=32)i++;
    i++;
    int b=readint(s1+i);
//    printf("a=%d b=%d\n",a,b);
    double c=(a-b)/(double)3+b;
    printf("%lf\n",c);
    return 0;
}
int readint(char *s){
    int i=0,ret=0;
    while(*(s+i)>=48 && *(s+i)<=57){
        ret*=10;
        ret+=*(s+i)-48;
        i+=1;
    }
    return ret;
}
    

ABC212-A

問題概要

与えられた2数のうち一方は0か。

解答

#n=gets.chomp.to_i
ans=""
a,b=gets.chomp.split(" ").map(&:to_i)
if 0<a and b==0 then
    ans="Gold"
elsif  a==0 and 0<b then
    ans="Silver"
else
    ans="Alloy"
end
puts ans
    

上がコンテスト中に提出したコード。(2021-07-31 21:04:02)

Cで書いたコードが以下。(2024-05-24 22:40:00)

int readint(char *s);
#include<stdio.h>
#include<stdlib.h>
#define N1 9
int main(void){
    char* s1=(char*)malloc(sizeof(char)*N1);
    if (s1==NULL){
        printf("memory allocation to s1 failed.\n");
        exit(1);
    }
    char *ts1=fgets(s1,N1,stdin);
    if(ts1==NULL){
        printf("fgets(s1) failed\n");
        exit(1);
    }
    int i=0;
    int a=readint(s1+i);
    while(*(s1+i)!=32)i++;
    i++;
    int b=readint(s1+i);
//    printf("a=%d b=%d\n",a,b);
    if (a>0 && b==0){
        printf("Gold\n");
    }else if (a==0 && b>0){
        printf("Silver\n");
    }else if(a>0 && b>0){
        printf("Alloy\n");
    }
    return 0;
}
int readint(char *s){
    int i=0,ret=0;
    while(*(s+i)>=48 && *(s+i)<=57){
        ret*=10;
        ret+=*(s+i)-48;
        i+=1;
    }
    return ret;
}
    

数値の範囲の条件判定

ABC214-A

問題概要

与えられた整数が125以下ならば4、126以上211以下ならば6、212以上ならば8を出力。

解答

n=gets.chomp.to_i
ans=4
if n>=126 and n<=211 then
    ans=6
elsif n>=212 then
    ans=8
end
puts ans
    

上がコンテスト中に提出したコード(2021-08-14 21:04:53)

Cで書いたコードが以下。(2024-06-10 22:35:18)

int readint(char *s);
#include<stdio.h>
#include<stdlib.h>
#define N1 5
int main(void){
    char* s1=(char*)malloc(sizeof(char)*N1);
    if (s1==NULL){
        printf("memory allocation to s1 failed.\n");
        exit(1);
    }
    char *ts1=fgets(s1,N1,stdin);
    if(ts1==NULL){
        printf("fgets(s1) failed\n");
        exit(1);
    }
    int n=readint(s1);
    int ans=0;
    if(n<126)ans=4;
    else if(n<212)ans=6;
    else ans=8;
    printf("%d\n",ans);
    return 0;
}
int readint(char *s){
    int i=0,ret=0;
    while(*(s+i)>=48 && *(s+i)<=57){
        ret*=10;
        ret+=*(s+i)-48;
        i+=1;
    }
    return ret;
}
    


条件判定、出力形式

ABC216-A

問題概要

小数部分が1桁の実数が与えられる。整数部分の後ろに、その小数第1位の数が2以下ならば-、7以上ならば+をつけて出力せよ。

解答

x,y=gets.chomp.split(".")
y=y.to_i
ans=x
if y<3
    ans+="-"
elsif y>=7
    ans+="+"
end
puts ans
    

この回は本番不参加。コンテストが日曜開催だったため、この日にコンテストがあることを把握できていなかった。

Rubyで書いたのに続けてCで書いたが、その間AtCoderの過去問を解くのをお休みしていたため、両コードの間で3カ月余り時間が空いている。

上がrubyで書いたコード。(2024-06-26 22:40:43)

Cで書いたのが以下。(2024-10-02 22:33:01)

int readint(char *s);
#include<stdio.h>
#include<stdlib.h>
#define N1 6
int main(void){
    char* s1=(char*)malloc(sizeof(char)*N1);
    if (s1==NULL){
        printf("memory allocation to s1 failed.\n");
        exit(1);
    }
    char *ts1=fgets(s1,N1,stdin);
    if(ts1==NULL){
        printf("fgets(s1) failed\n");
        exit(1);
    }
    int x,y;
    int i=0;
    int s=readint(s1+i);
    while(*(s1+i)!=46)i++;
    if(i==1){
        x=*s1-48;
    }else if(i==2){
        x=(*s1-48)*10+(*(s1+1)-48);
    }else{
        printf("error\n");
    }
    i++;
    y=readint(s1+i);
//    printf("x=%d y=%d\n",x,y);
    printf("%d",x);
    if(y<3){
        printf("%c\n",45);
    }else if(y<7){
        printf("\n");
    }else{
        printf("%c\n",43);
    }
    return 0;
}
int readint(char *s){
    int i=0,ret=0;
    while(*(s+i)>=48 && *(s+i)<=57){
        ret*=10;
        ret+=*(s+i)-48;
        i+=1;
    }
    return ret;
}
    

条件分岐

ABC219-A

問題概要

①0 点以上 40 点未満、②40 点以上 70 点未満、③70 点以上 90 点未満、④90 点以上、とランクが分かれている。ある点数が与えられるが、上位のランクになるためには最低あと何点必要か。ただし、既に90 点以上の場合はexpertと出力。

解答

x=gets.chomp.to_i
#s=gets.chomp.split("").to_a
ans=0
if x>=90 then
    puts "expert"
elsif x>=70 then
    puts 90-x
elsif x>=40 then
    puts 70-x
else
    puts 40-x
end
    

上がコンテスト中に提出したコード。(2021-09-18 21:05:36)

Cで書いたのが以下。(2024-10-09 22:22:40)

int readint(char *s);
#include<stdio.h>
#include<stdlib.h>
#define N1 5
int main(void){
    char* s1=(char*)malloc(sizeof(char)*N1);
    if (s1==NULL){
        printf("memory allocation to s1 failed.\n");
        exit(1);
    }
    char *ts1=fgets(s1,N1,stdin);
    if(ts1==NULL){
        printf("fgets(s1) failed\n");
        exit(1);
    }
    int x=readint(s1);
    if(x>=90){
        printf("expert\n");
    }else if (x>=70){
        printf("%d\n",90-x);
    }else if (x>=40){
        printf("%d\n",70-x);
    }else {
        printf("%d\n",40-x);
    }
    return 0;
}
int readint(char *s){
    int i=0,ret=0;
    while(*(s+i)>=48 && *(s+i)<=57){
        ret*=10;
        ret+=*(s+i)-48;
        i+=1;
    }
    return ret;
}
    

0 件のコメント:

コメントを投稿