打卡信奥刷题(1514)用C++实现信奥 P5989 [PA 2019] Wina

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](1a[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 1n2000 1 ≤ k ≤ n × ( n + 1 ) 2 1\le k\le \dfrac{n\times(n+1)}{2} 1k2n×(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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值