【タイトルリンク】
ルオグ P4956 [COCI2017-2018#6] ダヴォル
【タイトル試験会場】
1.列挙
【問題を解決するためのもの】
月曜日xxに資金調達x , 火曜日に資金調達x + k x+kバツ+k , …, サンデーレイズx + 6k x+6kバツ+6k._ _ _ 次に、1 週間資金を調達します:
∑ i = 0 6 ( x + i ⋅ k ) = 7 x + 21 k \sum_{i=0}^6(x+i\cdot k)=7x+21 k∑私は= 06( ×+私⋅k )=7x _+21,000 、資金調達に 52 週間: 52 ( 7 x + 21 k ) = 364 ( x + 3 k ) 52(7x+21k)=364(x+3k)52 ( 7x _+21k ) _=364 (×+3k )。 _
解決策 1:
- 列挙型オブジェクト: x
- 列挙範囲: 1 ≤ x ≤ 100 1\le x \le 1001≤バツ≤100
- 判定条件:k=(n/364-x)/3 k=(n/364-x)/3k=( n /364−x ) /3は正の整数、つまり( n / 364 − x ) % 3 == 0 (n/364-x)\%3==0( n /364−x ) %3==0および( n / 364 − x ) / 3 > 0 (n/364-x)/3>0( n /364−x ) /3>0
(n が 364 で割り切れるかどうかを判断する必要はありません。n が 364 で割り切れない場合、解はありません。)
問題の要件: x はできるだけ大きく、k はできるだけ小さくする必要があります。
そこで、x を大から小へとたどり、最初に条件を満たす x を探し、x から k を求め、x と k を出力してプログラムを終了します。
解決策 2:
- 列挙オブジェクト: x、k
- 列挙範囲: 1 ≤ x ≤ 100 1\le x \le 1001≤バツ≤100、k は 1 から始まり、364 ( x + 3 k ) ≤ n 364(x+3k)\le n364 (×+3k ) _≤n
- 判定条件:364(x+3k)=n 364(x+3k)=n364 (×+3k ) _=n
問題の要件: x はできるだけ大きく、k はできるだけ小さくします。
したがって、x は大きいものから小さいものへ、k は小さいものから大きいものへとたどり
、最初に条件を満たす x と k を見つけて出力し、プログラムを終了します。
【質問コード】
解決策 1:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
for(int x = 100; x >= 1; --x)
{
if((n/364-x)%3 == 0 && (n/364-x)/3 > 0)
{
cout << x << endl << (n/364-x)/3;
return 0;
}
}
return 0;
}
解決策 2:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
for(int x = 100; x >= 1; --x)
for(int k = 1; 364*(x+3*k) <= n; ++k)
if(364*(x+3*k) == n)
{
cout << x << endl << k;
return 0;
}
return 0;
}