社区讨论

不懂代码,求解释

题目总版参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@m4s15eb6
此快照首次捕获于
2024/12/17 13:35
去年
此快照最后确认于
2025/11/04 12:43
4 个月前
查看原帖
题目描述 经过多番苦战,小K成功闯入了魔王LX的城堡。魔王LX被逼无奈,放出了他的秘密武器:赛博人克隆军团。
赛博人军团组成了大小为 n×mn \times m 的一个矩阵队列,其中位置 a[i][j]a[i][j] 的赛博人士兵战斗力为 i×ji \times j(下标从 1 开始)。
决战前,小K 望着面前的大军陷入了沉思。他想知道,在整个矩阵军团中,战斗力第 kk 小的士兵的战斗力是多少。 输入
  • 三个整数 n,m,kn, m, k,表示矩阵的行数、列数以及第 kk 小的士兵编号。(1n,m3×104)(1 \leq n, m \leq 3 \times 10^4)(1kn×m)(1 \leq k \leq n \times m)
输出
  • 一个整数,表示战斗力第 kk 小的士兵的战力值。 样例输入 Copy 3 3 5 样例输出 Copy 3 提示

样例解释

  • 对于输入样例 1,矩阵军团如下: CPP
    1 2 3
    2 4 6
    3 6 9
    
    战斗力从小到大排列:1,2,2,3,3,4,6,6,91, 2, 2, 3, 3, 4, 6, 6, 9,所以第 5 小的战斗力是 33
输入样例2
2 3 6
输出样例2
6
  • 对于输入样例 2,矩阵军团如下: CPP
    1 2 3
    2 4 6
    
    战斗力从小到大排列:1,2,2,3,4,61, 2, 2, 3, 4, 6,所以第 6 小的战斗力是 66

代码的for循环部分不明白什么意思,求大佬解释

CPP
#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int main(){
   cin>>n>>m>>k;
   long long l=1,r=n*m;
   while(l<r)
   {
   	long long p=0,mid=(l+r)/2;
   	for(int i=1;i<=n;i++)
   	{
   		long long j=mid/i;
   		if(j>m) p+=m;
   		else p+=j;
   	}
   	if(p>=k) r=mid;
   	else l=mid+1;
   }
   cout<<r;
   return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...