トピックリンク:使用不可番号
制限時間:1秒メモリ制限:256 MB
タイトルの説明:
シャオミンはキャンディーストアをオープンしました。彼は独創的です:フルーツキャンディーを4個と7個の2つのパックに詰めます。キャンディーは開梱して販売することはできません。
子供がお菓子を買いに来るとき、彼はこれらの2つのパッケージを組み合わせて使用します。もちろん、10個のキャンディーなど、組み合わせられないキャンディーもあります。
コンピューターでテストできます。このパッケージの場合、使用できない最大数量は17です。17より大きい任意の数は、4および7と組み合わせることができます。
この質問の要件は、2つのパッケージの数量がわかっている場合に組み合わせることができない最大数を見つけることです。
入力:
各パッケージ内の糖の数を示す2つの正の整数(1000以下)
2つの正の整数が比較的素数であることを確認するための入力
出力:
購入できない糖の最大数を示す正の整数
サンプル入力:
4 7
サンプル出力:
17
質問:組み合わせることができない最大の数を見つけてください。
アイデア:データ範囲が広くないため、ほとんど暴力的です。次に、それらに1つずつマークを付けます。
問題のデータは、2つの数値が1000以下であることを示しているため、配列pを1000000まで大きく定義し、最初からマークを付けます。
p [i] = 1は、数iを組み合わせることができることを意味します
p [i] = 0は、数iを組み合わせることができないことを意味します
2つのパッケージ数量はそれぞれaとbであると仮定します。数値iを組み合わせることができる場合、i + aとi + bも組み合わせることができるかどうか、このように小さいものから大きいものへとマークを付け、次に大きいものから始めます。小さなトラバーサルに対して、p [i] == 0の場合(後方にトラバースしているため、最初の数値p [i] == 0は結合できない最大の数値です)、それを出力するだけです。
コードを見てください:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000000;
int p[maxn+1]={
0};
int main()
{
int a,b;
while(cin>>a>>b)
{
//cout<<a*b-a-b<<endl;
memset(p,0,sizeof(p)); // 每次初始化一下
p[0]=1;
for(int i=1;i<=maxn;i++)
{
if(i>=a&&p[i-a])
p[i]=1;
else if(i>=b&&p[i-b])
p[i]=1;
}
for(int i=maxn;i>=1;i--)
{
if(!p[i])
{
cout<<i<<endl;
break;
}
}
}
return 0;
}
注意深く少しかわいい、私のコメントされたコードを見ましたか?この質問に対する究極の解決策を見つけて、おめでとうございます。はい、その文を書いてください。
数論であるこの解決策については、あまり説明しません。興味のある方は証明してみてください。
究極のコード:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b;
while(cin>>a>>b)
{
cout<<a*b-a-b<<endl;
}
return 0;
}
読んだ後は忘れずに気に入ってください、応援よろしくお願いします!
コンピュータ端末の場合は、右下隅に「ワンキートリプル接続」が表示されているので、右クリックしてください[笑]
いい加減にして!
共に働く!
Keafmd