A – テスト評価
A - テスト評価
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
問題文の通りにif文を書くだけです。
#include<bits/stdc++.h>
#include<atcoder/all>
using namespace std;
using namespace atcoder;
int main(){
int N;
cin>>N;
if(N<=59) cout<<"Bad"<<endl;
else if(N<=89) cout<<"Good"<<endl;
else if(N<=99) cout<<"Great"<<endl;
else cout<<"Perfect"<<endl;
}
B – 文字数カウント
B - 文字数カウント
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
文字列として受け取って、forで一文字ずつ見ながらカウントする方法が普通かと思います。
#include<bits/stdc++.h>
#include<atcoder/all>
using namespace std;
using namespace atcoder;
int main(){
int cnt[6]={0};
string S;
cin>>S;
for(int i=0;i<S.size();i++){
cnt[S[i]-'A']++;
}
cout<<cnt[0]<<" "<<cnt[1]<<" "<<cnt[2]<<" "<<cnt[3]<<" "<<cnt[4]<<" "<<cnt[5]<<endl;
}
文字は内部的には整数値です。(ASCIIコード)
A,B,C,D…は連番になっており、後ろになるほど大きくなります。
なので、’A’-‘A’=0,’B’-‘A’=1,’C’-‘A’=3…と’A’を引くことで、アルファベット何文字目かを取得できます。
C – 数を3つ選ぶマン
C - 数を3つ選ぶマン
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
5文字から3つなので、5C3=10通りとパターンが少ないです。
手打ちで全列挙しました。真面目にやるなら、3重for回すのが一番普通かと思います。
#include<bits/stdc++.h>
#include<atcoder/all>
using namespace std;
using namespace atcoder;
int main(){
int A,B,C,D,E;
cin>>A>>B>>C>>D>>E;
int ans[10];
ans[0]=A+B+C;
ans[1]=A+B+D;
ans[2]=A+B+E;
ans[3]=A+C+D;
ans[4]=A+C+E;
ans[5]=A+D+E;
ans[6]=B+C+D;
ans[7]=B+C+E;
ans[8]=B+D+E;
ans[9]=C+D+E;
sort(ans,ans+10);
cout<<ans[7]<<endl;
}
下のコードはforで書こうと思ったら、予想以上にややこしくなったものです。
#include<bits/stdc++.h>
#include<atcoder/all>
using namespace std;
using namespace atcoder;
int main(){
int A,B,C,D,E;
int mx1=0,mx2=0,mx3=0;
cin>>A>>B>>C>>D>>E;
for(int i=0;i<5;i++){
for(int j=i+1;j<5;j++){
for(int k=j+1;k<5;k++){
if(i!=j&&j!=k&&i!=k){
int n=0;
if(i==0||j==0||k==0) n+=A;
if(i==1||j==1||k==1) n+=B;
if(i==2||j==2||k==2) n+=C;
if(i==3||j==3||k==3) n+=D;
if(i==4||j==4||k==4) n+=E;
if(mx1<n){
mx3=mx2;
mx2=mx1;
mx1=n;
}
else if(mx2<n){
mx3=mx2;
mx2=n;
}
else if(mx3<n){
mx3=n;
}
}
}
}
}
cout<<mx3<<endl;
}
D – 乱数生成
D - 乱数生成
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
中央値がKとなるためには、以下のパターンのどれかである必要があります。
- (K,Kより大きい,Kより小さい)
- (K,K,Kより大きい)
- (K,K,Kより小さい)
- (K,K,K)
また、数字の順番は特に関係ないため、1,2,3はそれぞれ入れ替えのパターンを考えればOKです。
中央値がKになるパターンを、全パターン数のN*N*Nで割ればOKです。
#include<bits/stdc++.h>
#include<atcoder/all>
using namespace std;
using namespace atcoder;
int main(){
double N,K;
cin>>N>>K;
double c=1;
c*=1;
c*=(K-1);
c*=(N-K);
c*=6;
double c2=1;
c2*=1;
c2*=1;
c2*=(N-K);
c2*=3;
double c3=1;
c3*=1;
c3*=(K-1);
c3*=1;
c3*=3;
double c4=1;
c4*=1;
c4*=1;
c4*=1;
c*=1;
printf("%.12f\n",(c+c2+c3+c4)/(N*N*N));
}
中央値Kの総数の式を纏めると、
(K-1)*(N-K)*6+(N-K)*3+(K-1)*3+1 =(K-1)*(N-K)*6+(N-K+K-1)*3+1 =(K-1)*(N-K)*6+(N-1)*3+1
となるため、まとめて下記コードでもOKです。
#include<bits/stdc++.h>
#include<atcoder/all>
using namespace std;
using namespace atcoder;
int main(){
double N,K;
cin>>N>>K;
printf("%.12f\n",((K-1)*(N-K)*6+(N-1)*3+1)/(N*N*N));
}
関係ない話
SteamでApexを始めたのですが、むちゃくそ難しいですね…。
0ダメで終わる試合がほとんどです…。
フレンドだと気楽でいいのですが、野良は怖さもあります> <
コメント