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

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

Intro


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

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

・今日の一問

ABC117B問題解いてみます。
以前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に続く!(不定期連載です。)

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

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