文系ギャルが0から始める競技プログラミング#6
Intro
この記事は不定期連載です。
↓最初の一本はこちら↓
文系ギャルが0から始める競技プログラミング#0
↓直前の記事はこちら↓
文系ギャルが0から始める競技プログラミング#5
・今日の一問
ABC117のB問題を解いてみます。
以前chokudaiさんのブログで、色に関する記事を見たときに
茶色の人の半数が解ける問題です!と書いてあった気がしたので!
要求タイム:5分と書いてありますが見ないふりをしました。
問題文
2次元平面上に辺の長さがそれぞれ L1,L2,...,(凸多角形でなくてもよい)が描けるかを判定してください。
ここで、次の定理を利用しても構いません。
定理 : 一番長い辺が他のN−1辺の長さの合計よりも真に短い場合に限り、条件を満たすN角形が描ける。
制約
入力は全て整数である。
3≤N≤10
1≤Li≤100
入力
入力は以下の形式で標準入力から与えられる。
N
L1 L2...LN
出力
条件を満たすN角形が描けるなら Yes、そうでないなら No を出力せよ。
― B - Polygon
便利なのあるーーー!
そんな定理しらねーーー!
と思いつつ、この定理のおかげでまだ解き筋が見えてきました。
各辺の長さを配列にぶっこみつつ、配列の合計と最大値を取ればイイ感じかな?と思いつきます。
ゴールを整理します。
max_L*2<aだったら"Yes"、そうじゃなかったら"No"っぽいです。
if(max_L*2<a){
cout << "Yes" << endl;
}else{
cout << "No" << endl;
}
辺の数は10個がMAXっぽいので、適当に10個の配列を作っておけばよさそうです。
int L[10] = {};
どうやらMaxというものを使うと大きい方を返してくれそうなので、
暫定の最大と次の数を比べて、大きい方を更新していくのをN回繰り返せば最大値が取れそうです。
while(N--){
max_L = max(max_L,L[i]);
i++;
というわけで、こんな感じ…?
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int N;
cin >> N;
int n = N;
int L[10] = {};
int i = 0;
int a = 0;
while (n--){
cin >> L[i];
a += L[i];
i++;
}
i = 0;
int max_L = 0;
while(N--){
max_L = max(max_L,L[i]);
i++;
}
if(max_L*2<a){
cout << "Yes" << endl;
}else{
cout << "No" << endl;
}
return 0;
}
辛うじて天才だったのでACですが、時間はめっちゃかかってます…
端折ってるけど…。
これ5分で解けるんですか…。
修行します。
天才の上ってなんなんだろ…。
ちなみに今日はタピオカ飲みました。
春水堂(ちゅんすいたん)がお気に入りです!
Outro
今度こそ本紹介しよっと…!
#7に続く!(不定期連載です。)
これは成功と挫折を繰り返し、
タピオカ片手に難問を解く、
ギャルプログラマが生まれるまでの物語である…。
この記事が気に入ったらサポートをしてみませんか?