P5989 [PA 2019] Wina
题目描述
n n n 行 n × ( n + 1 ) 2 \dfrac{n\times(n+1)}{2} 2n×(n+1) 个数叠成了一个数塔。
给定 k k k,你需要从中拿走恰好 k k k 个数,使得拿走的数的最小值最小。一个数能被拿走当且仅当它左上角和右上角都没有数或者那个数已经被拿走了。
输入格式
第一行两个正整数
n
,
k
n,k
n,k。
接下来
n
n
n 行,第
i
i
i行
i
i
i个正整数
a
[
i
]
[
1
]
,
a
[
i
]
[
2
]
,
.
.
.
,
a
[
i
]
[
i
]
(
1
≤
a
[
i
]
[
j
]
≤
2019
)
a[i][1],a[i][2],...,a[i][i](1\le a[i][j]\le 2019)
a[i][1],a[i][2],...,a[i][i](1≤a[i][j]≤2019),表示从上往下第
i
i
i 行从左往右第
j
j
j 个数。
输出格式
输出一行一个整数,即拿走的数的最小值的最小值。
输入输出样例 #1
输入 #1
5 7
1999
2019 2010
850 1500 1600
900 900 710 900
1000 800 600 800 1000
输出 #1
710
说明/提示
对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 2000 1\le n\le 2000 1≤n≤2000, 1 ≤ k ≤ n × ( n + 1 ) 2 1\le k\le \dfrac{n\times(n+1)}{2} 1≤k≤2n×(n+1)。
样例解释:
C++实现
#include <iostream>
#include <algorithm>
using namespace std;
int n,k,ans=2019;
int f(int x,int y)
{
if(x/2<y)y=x+1-y;
return (x-y+1)*y;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>k;
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
{
int num;
cin>>num;
if(f(i,j)<=k)ans=min(ans,num);
}
cout<<ans<<endl;
return 0;
}
后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容