ルオグ P4956 [COCI2017-2018#6] ダヴォル

【タイトルリンク】

ルオグ 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 /364x ) /3は正の整数、つまり( n / 364 − x ) % 3 == 0 (n/364-x)\%3==0( n /364x ) %3==0および( n / 364 − x ) / 3 > 0 (n/364-x)/3>0( n /364x ) /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;
}

おすすめ

転載: blog.csdn.net/lq1990717/article/details/127403272