NYOJ 16矩形ネスト(ベースdp+二分)
2503 ワード
長方形のネスト
時間制限:
3000 ms|メモリ制限:
65535 KB難易度:
4
説明
長さと幅を表すn個の矩形があり、各矩形はa,bで記述することができる.矩形X(a,b)は、矩形Y(c,d)にネストすることができ、aのみ
入力
1行目は正の数Nである(0試験データのグループ毎の1行目は正の数nであり、このグループの試験データに矩形の個数が含まれていることを示す(n<=1000)
次のn行は、各行に2つの数a,b(0 しゅつりょくテストデータのセットごとに1つの数を出力し、最大条件を満たす矩形の数を表し、各グループの出力は1行を占めます。 サンプル入力 1 10 1 2 2 4 5 8 6 10 7 9 3 1 5 8 12 10 9 7 2 2 サンプル出力 5
//wa通りすがりの大物を求めてグループのデータにあげて、原因を指摘します
//n 2のアルゴリズム
//ac
時間制限:
3000 ms|メモリ制限:
65535 KB難易度:
4
説明
長さと幅を表すn個の矩形があり、各矩形はa,bで記述することができる.矩形X(a,b)は、矩形Y(c,d)にネストすることができ、aのみ
入力
1行目は正の数Nである(0試験データのグループ毎の1行目は正の数nであり、このグループの試験データに矩形の個数が含まれていることを示す(n<=1000)
次のn行は、各行に2つの数a,b(0 しゅつりょくテストデータのセットごとに1つの数を出力し、最大条件を満たす矩形の数を表し、各グループの出力は1行を占めます。 サンプル入力 1 10 1 2 2 4 5 8 6 10 7 9 3 1 5 8 12 10 9 7 2 2 サンプル出力 5
//wa通りすがりの大物を求めてグループのデータにあげて、原因を指摘します
#include
#include
#include
using namespace std;
int dp[1000 + 10], len;
struct rec
{
int x;
int y;
}a[1000 + 10];
int cmp(rec a, rec b)
{
if (a.x == b.x)
return a.y> 1;
if (dp[mid] >= key)
right = mid - 1;
else
left = mid + 1;
}
return left;//
}
int main()
{
int t, n;
cin >> t;
while (t--)
{
cin >> n;
for (int i = 1; i <= n; i++)
{
scanf("%d%d", &a[i].x, &a[i].y);
if (a[i].xa[i - 1].x)
k = 0;
if(a[i].x>a[i-1].x‖k==0)/x,yが に より きい にのみlenを させる
{
if (len < tmp)
{
len = tmp;
k = 1;
}
dp[tmp] = a[i].y;
}
}
printf("%d", len);
}
return 0;
}
//n 2のアルゴリズム
//ac
#include
#include
#include
#include
using namespace std;
int dp[1000 + 20];
struct rec
{
int x;
int y;
}a[1000 + 20];
int cmp(rec a, rec b)
{
if (a.x < b.x)
return 1;
if (a.x == b.x)
return a.ya[j].y && a[i].x>a[j].x)
{
dp[i] = max(dp[i], dp[j] + 1);
}
}
ans = max(ans, dp[i]);
}
/*
for (int i = 0; i < n; i++)
{
dp[i] = 1;
for (int j = 0; j a[j].y && a[i].x>a[j].x)
{
dp[i] = max(dp[i], dp[j] + 1);
}
ans = max(ans, dp[i]);// , 3 !!!!!// , ?
}// , 。。。。
}
*/
printf("%d
", ans);
}
return 0;
}