Description
给定 (n le 2000) 行总共 (frac {n(n+1)} 2) 个数字堆叠成了一个数塔,从上往下数第 (i) 行里恰好有 (i) 个数。给定 (k),你需要恰好从中拿走 (k) 个数字,使得拿走的数字的最小值最小。一个数可以被拿走当且仅当它的左上角和右上角没有数字。
Solution
显然我们只需要瞄准一个目标数字即可,问题在于计算出要想删除这个数字必须要删除的数字个数有多少。
手玩一下发现结论是,当我们删除第 (i) 行第 (j) 列的数字时,必须要删除的数字的总个数是 (j(i-j+1)),因为必须要被删除的图形斜着看刚好是一个矩形。
于是扫一遍即可。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2005;
int a[N][N],ans=1e9,n,k;
signed main()
{
ios::sync_with_stdio(false);
cin>>n>>k;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
cin>>a[i][j];
if(j*(i-j+1)<=k)
{
ans=min(ans,a[i][j]);
}
}
}
cout<<ans<<endl;
}