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

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

Intro

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

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

・ABC095B

けんちょんさんの記事に戻りつつ埋めていたりします。
最近色々と忙しくてなかなか優勝する時間が取れない、、、
忘れる前にガンガン解いていきたいと思います!!!!

問題文
パティシエの赤木さんは、「お菓子の素」という粉のみを材料としてN種類のドーナツを作ることができます。
これらのドーナツはドーナツ1、ドーナツ2、...、ドーナツNと呼ばれます。
ドーナツi(1≤i≤N)を1個作るには、お菓子の素miグラムを消費する必要があります。
なお、0.5個など整数でない個数のドーナツを作ることはできません。
いま、赤木さんはお菓子の素をXグラム持っています。
これを使って、今夜のパーティーに向けて可能な限りたくさんのドーナツを作ることにしました。
ただし、来客の味の好みは様々なので、次の条件を守ることにしました。
N種類のドーナツそれぞれを少なくとも1個は作る。
このとき、最大で何個のドーナツを作ることができるでしょうか?
お菓子の素を使い切る必要はありません。
また、この問題の制約のもとでは、条件を守ることは必ず可能です。

制約
2≤N≤100
1≤mi≤1000
m1+m2+...+mN≤X≤10^5
入力中のすべての値は整数である。
入力
入力は以下の形式で標準入力から与えられる。
N X
m1
m2
:
mN

出力

条件を守って作ることのできるドーナツの最大の個数を出力せよ。

B - Bitter Alchemy

ドーナツ食べたい…
しかもめっちゃ種類作ってくれるとかミスドかよ。優勝でしょ。

問題を整理します。
N種類のドーナツをそれぞれ少なくとも1個は作れることが保証されてる中で、個数を最大にしたいということは、
N種類のドーナツを作った上で、まだ余ったお菓子の素を使って素を使う量が一番少ないドーナツ量産するのが最善です。

必要な素の量を、motoとおきます。

   int N,X;
   cin >> N >> X;
   int m[100] = {};
   int moto = 0;
   
   for(int i=0;i<N;i++){
       cin >> m[i];
       moto = moto+m[i];
   }

レシピm[i]をしまうついでに、N種類のドーナツをつくったときの素の量も取ってみます。

ドーナツのレシピを並び替えて…

   sort(m,m+N);

N個つくる+持ってる素からmotoを引いたものから、一番少ないm[0]のレシピで量産するので割ります。

   cout << N+((X-moto)/m[0]) << endl;

あっさり優勝〜〜〜〜!

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main()
{
   int N,X;
   cin >> N >> X;
   int m[100] = {};
   int moto = 0;
   
   for(int i=0;i<N;i++){
       cin >> m[i];
       moto = moto+m[i];
   }
   
   sort(m,m+N);
   
   cout << N+((X-moto)/m[0]) << endl;
   
       return 0;
}

B問題はさっくり思いつく場合が多くなってきました。
これが天才成長力であり優勝力です。(天才)

ドーナツネタでもう一本。

・ABC105B

問題文
ABC洋菓子店では,1個4ドルのケーキと1個7ドルのドーナツが売られている.
このとき, 合計金額がNドルとなる買い方はあるか, 判定せよ.
ただし, 同じ商品を二個以上買っても良く, 買わない商品があっても良いものとする.

制約
Nは1以上100以下の整数

入力

入力は以下の形式で標準入力から与えられる.
N

出力
合計がNドルとなる買い方がある場合 Yes,
そうでない場合 No と出力せよ.

B - Cakes and Donuts

今度は買います。
ケーキが4ドルは割とお買い得だけど、7ドルのドーナツ何個入りなんだろ…(どうでもいい疑問

ケーキの個数をx,ドーナツの個数をyとおいて、条件満たしたら1にするyesを作ります。


   int N;
   cin >> N;
   int x = 0;
   int y = 0;
   int yes = 0;

あとはたかだか2重なのでイケると踏んで、
for文でぶん回します!

   for(x=0;x<N;x++){
       for(y=0;y<N;y++){
       if((x*4)+(y*7)==N){
           yes = 1;
           break;
           }
       }

yesが1だったらYes,そうでなかったらNoを出力して優勝です。


   if(yes == 1){
       cout << "Yes" << endl;
   }else{
       cout << "No" << endl;
   }
       return 0;
}

はい〜〜〜〜完全☆勝利〜〜優勝!!!


#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main()
{
   int N;
   cin >> N;
   int x = 0;
   int y = 0;
   int yes = 0;
   for(x=0;x<N;x++){
       for(y=0;y<N;y++){
       if((x*4)+(y*7)==N){
           yes = 1;
           break;
           }
       }
   }
   if(yes == 1){
       cout << "Yes" << endl;
   }else{
       cout << "No" << endl;
   }
       return 0;
}


さっくり解けました!!!
更新頻度が最初の頃より下がるとは思いますが、
合間合間に優勝していきますのでよろしくおねがいします!!!

Twitter元気に更新中ですので、便利なテクニックからクソリプまでバンバンお待ちしております!
(競プロリストも結構眺めてるよ!)

↑TLEへの恐怖に怯えるわたしです


Outro


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

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

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