[LOJ3216] Wina - 思维
作者:互联网
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;
}
标签:思维,数字,删除,int,个数,long,拿走,LOJ3216,Wina 来源: https://www.cnblogs.com/mollnn/p/13747871.html