其他分享
首页 > 其他分享> > [LOJ3216] Wina - 思维

[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