vjudge質問バンクAA

vjudge質問バンクAA

タイトル->

  • n本の棒の山があります。各スティックの長さと重量は事前にわかっています。スティックは木工機械で一つ一つ加工されます。マシンがスティックの処理を準備するには、セットアップ時間と呼ばれる時間が必要です。セットアップ時間は、機械の清掃作業と工具や形状の変更に関連しています。木工機械の段取り時間は次のとおりです。
    (a)最初の木製スティックの段取り時間は1分です。
    (b)長さlと重量wのスティックを処理した直後、l <= l 'とw <= w'の場合、機械は長さl 'と重量w'のスティックのセットアップ時間を必要としません。それ以外の場合は、セットアップに1分かかります。
    あなたはn本の木の棒の与えられた山を処理するための最小セットアップ時間を見つけることです。たとえば、長さと重量のペアが(9、4)、(2、5)、(1、2)、(5、3)、および(4、1)である5つのスティックがある場合、最小セットアップ(4、1)、(5、3)、(9、4)、(1、2)、(2、5)のシーケンスがあるため、時間は2分である必要があります。

入力

  • 入力はTテストケースで構成されます。テストケースの数(T)は、入力ファイルの最初の行に示されています。各テストケースは2つの行で構成されています。最初の行にはテストケースの木製の棒の数を表す整数n、1 <= n <= 5000があり、2番目の行には2nの正の整数l1、w1、l2、 w2、…、ln、wn、それぞれの大きさは最大10000、ここでliとwiはそれぞれi番目の木の棒の長さと重さです。2nの整数は、1つ以上のスペースで区切られます。

出力

  • 出力には、最小セットアップ時間(分)が1行に1つ含まれているはずです。

入力例

  • 3
    5
    4 9 5 2 2 1 3 5 1 4
    3
    2 2 1 1 2 2
    3
    1 3 2 2 3 1

出力例

2
1
3
理解すべきトピック>
Google ここに画像の説明を挿入
はn本の棒の束を称賛しています。各ロッドの長さと重量は事前にわかっています。これらの木の棒は、木工機械で1つずつ処理されます。スティックの取り扱いを準備するには、マシンに準備時間(準備時間と呼ばれます)が必要です。設定時間は、機械の清掃作業と工具や形状の交換に関連しています。木工機械のセット時間は次のとおりです。
(a)最初の木棒の準備時間は1分です。
(B)長さlおよび重量wのロッドを処理した後、l <= l 'およびw <= w'の場合、機械は長さl 'および重量w'のロッドの設定時間を設定する必要はありません。それ以外の場合は、設定に1分かかります。
あなたは与えられたn本の棒を処理するための最短の準備時間を見つけるでしょう。たとえば、長さと重量のペアが(9、4)、(2、5)、(1,2)、(5、3)および(4、1)のジョイスティックが5つある場合、最小設定時間(4、1)、(5、3)、(9、4)、(1,2、)、(2、5)のペアのシーケンスがあるため、2分にする必要があります。
入力値
inputには、T個のテストケースが含まれています。テストケースの数(T)は、入力ファイルの最初の行に示されています。各テストケースは2つの行で構成されています。最初の行にはテストケースの棒の数を表す整数n、1 <= n <= 5000があり、2番目の行には2nの正の整数l1、w1、l2、w2、...が含まれています。 、Ln、wn、それぞれの最大サイズは10000で、liとwiはそれぞれi番目の木の棒の長さと重さです。2nの整数は、1つ以上のスペースで区切られます。
出力
出力には、最小整定時間が分単位で1行に1つ含まれている必要があります。

もちろん最初に考えるのはソートの方法ですが、lとwの量が2つあり、2つの配列が別々に計算されると、途中で多くのケースを見逃してしまいます。つまり、元のバックパックと似ています。最初にlを修正してから、wを比較することができます(ボードのにおいがします)。—>見てみましょう

#include <cstdio>
#include <iostream> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int maxn=5000+5; int t,n,ans1,f[maxn]; struct Senorita{ int l,w; }a[maxn]; bool comp1(Senorita A,Senorita B) { if(A.l==B.l) return A.w<B.w; return A.l<B.l; } int main() { scanf("%d",&t); while(t--) { memset(a,0,sizeof(a)); memset(f,0,sizeof(f)); ans1=1; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d%d",&a[i].l,&a[i].w); f[i]=1; } sort(a+1,a+n+1,comp1); for(int i=2;i<=n;i++) { f[i]=1; for(int j=1;j<i;j++) { if(a[i].w<a[j].w&&f[i]<f[j]+1) { f[i]=f[j]+1; ans1=max(ans1,f[i]); } } } printf("%d\n",ans1); } return 0; } 

だが

これは私が言いたいことですか?もちろん
、初期テスト中にコードを省略せ、memsetが初期化されるときにf配列を1に直接初期化するため、後でfを割り当てる必要はありません。しかし、問題はここにあり、Baidu memset関数を使用しているときに、sizeofとその逆の値を記述してから長い時間が経過しており、グローバル変数の設定は効果がありません。レノボを検索すると、memsetは0と-1しか初期化できないと書いています

ブーム!

したがって、この関数をもう一度確認してみましょう。KangKang Baidu言い換え
ここに画像の説明を挿入は、一般に文字配列を初期化し、バイナリ割り当てに依存します。intは4バイトで、各位置を割り当て、0と1のみをサポートするため、同時に初期化することしかできません[ 00000000 00000000 00000000 00000000]は0で、[11111111 11111111 11111111 11111111]は-1です。

完成した

別の幸せな日ここに画像の説明を挿入

おすすめ

転載: www.cnblogs.com/1999-09-21Karry-erfs/p/12695408.html