スクリーンショット_2019-04-04_23

文系ギャルが0から始める競技プログラミング#31

Intro

この記事は不定期連載です。
↓最初の一本はこちら↓
文系ギャルが0から始める競技プログラミング#0

↓直前の記事はこちら↓
文系ギャルが0から始める競技プログラミング#30

ご無沙汰してます!!!!!
文系ギャルです!!!!!!

Twitterは元気につぶやいてました!!!

だいぶ間あきましたが、
ABC138に参加したので記事にしていきたいと思います!!!!

・ABC138A

問題文
整数aと、英小文字からなる文字列sが入力されます。
aが3200以上ならsと出力し、aが3200未満ならredと出力するプログラムを書いてください。

制約
2800≤a<5000
sは長さ1以上10以下の文字列である。
sの各文字は英小文字である。

入力
入力は以下の形式で標準入力から与えられる。
a
s

出力
aが3200以上ならsと出力し、aが3200未満ならredと出力せよ。
A - Red or Not

これはわかるぞ!!!!!!!!!!!!

#include <iostream>
#include <algorithm>
#include <string>
#include <cmath>
#include <vector>
#include <regex>
#include <map>
#include <set>
using namespace std;
using ll = long long;
int main() {
   int a;
   string s;
   cin >> a >> s;
   
   if(a>=3200){
       cout << s << endl;
   }else{
       cout << "red" << endl;
   }
}

3200以上だったら、で分岐したらいいだけですね。
次いってみましょう!!!!!

・ABC138B

分数がうまいこと表示できないのでまるごと転載します。
問題あったら教えて下さい…。

B - Resistors in Parallel

算数アレルギーが出て一旦飛ばしました
ぐぐったら通分すればよくね?となりました。
最小公倍数?の計算がいるかな?と思ったけど、
たかが1000*100じゃん!と思い全部掛け算するパワープレイをすることに。
優勝!!!!

#include <iostream>
#include <algorithm>
#include <string>
#include <cmath>
#include <vector>
#include <regex>
#include <map>
#include <set>
using namespace std;
using ll = long long;
int main() {
   int N;
   cin >> N;
   
   double A[N];
   for(int i=0;i<N;i++){
       cin >> A[i];
   }
   double bunsi = 1;
   double bunbo = 0;
   
   for(int i=0;i<N;i++){
       bunsi *= A[i];
   }
   
   for(int i=0;i<N;i++){
       bunbo += bunsi/A[i];
   }
   double ans = 0;
   ans = bunsi/bunbo;
   
   cout << ans << endl;
   
}

はい!!!!!!!!
優勝!!!!!!!!!!!!

ちょっと時間かかったけど天才なので優勝してしまいました。

・ABC138C

問題文
あなたは鍋とN個の具材を持っています。
各具材は価値と呼ばれる実数の値を持ち、i個目(1≤i≤N)の具材の価値はviです。
2個の具材を鍋に入れると、それらは消滅して新たに1個の具材が生成されます。
この新たな具材の価値は元の2個の具材の価値をx,yとして(x+y)/2であり、この具材を再び鍋に入れることもできます。
この具材の合成をN−1回行うと、最後に1個の具材が残ります。
この具材の価値として考えられる最大の値を求めてください。

制約
2≤N≤50
1≤vi≤1000
入力中の値はすべて整数である。

入力
入力は以下の形式で標準入力から与えられる。
N
v1 v2 … vN

出力
最後に残る1個の具材の価値として考えられる最大の値を表す小数(または整数)を出力せよ。
出力は、ジャッジの出力との絶対誤差または相対誤差が10−5以下のとき正解と判定される。
C - Alchemist

おっ何言ってんだ!(初見)
にいろいろいれてぐるぐるするようです。

まず手順を考えます。
足して2で割るということは、差が少ないほうがいいと考えて少ない順に2つ投入していくことにします。

投入した具消滅します。
つまり小さい順に2つ投入新しい具材を追加して、
投入した具材は消していけば最終的に1個残りそうです。


こんな感じ?

そして書き上がったのがこちらです。

#include <iostream>
#include <algorithm>
#include <string>
#include <cmath>
#include <vector>
#include <regex>
#include <map>
#include <set>
using namespace std;
using ll = long long;
int main() {
   int N;
   cin >>N;
   int v[N];
   vector<double> V;
   for(int i=0;i<N;i++){
       cin >> v[i];
       V.push_back(v[i]);
   }
   for(int i=0;i<N-1;i++){
       sort(V.begin(),V.end());
       V.push_back((V[0]+V[1])/2);
       V.erase(V.begin());
       V.erase(V.begin());
   }
   
   cout << V[0] << endl;
return 0;
}

頭から2個消す、がわからなくて
2回頭を消すという天才ムーブを思いつきました!!!!!!!
すごい!!!!!!

スマートな方法があったらTwitterコメントで教えて下さい。

なかなか優勝する時間が取れず間が空いてしまいました
これからも精進してまいりますので応援よろしくお願いいたします!!!
絶対優勝!!!!!!!!!!!!!


Outro

#32に続く!(不定期連載です。)

これは成功と挫折を繰り返し、
タピオカ片手に難問を解く、
ギャルプログラマが生まれるまでの物語である…。

この記事が気に入ったらサポートをしてみませんか?