一道个人感觉叫好的题
2026-06-23 13:07:57
发布于:四川
题目描述
给出一个长度为$ N A=(A₁,A₂,…,A_{N}) $和一个整数 。
你可以在 和 次之间执行以下操作:选择一个满足 的整数 ,把 加到 ᵢ 上。
操作结束后,求序列最小值的最大可能值。
约束条件
所有输入值都是整数。
输入格式
输出格式
输出答案
思路
有点二分:让加完数后最小的那个数尽量大,先随便猜一个目标答案,再把所有数都拉到这个目标,要花多少次数,如果次数够就往大猜,不够就往小猜,反复猜了之后,最后剩下来的那个数就是答案。
这是我的现场思路,可能有点复杂,请大家多多谅解。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=2e5+100;
ll a[N],l[N],c[N],ans[N];// ans数组:存储所有读入的数字序列
int pos[N];// pos[i]:记录第i组数据在ans里的起始下标
int main(){
int n;
ll k;
cin>>n>>k;//输入:n组数据,要找第k位
int cnt=0;//cnt:ans数组当前用到哪个位置
// 第一步:读入 n 组数据
for(int i=0;i<n;i++){
cin>>l[i];// 读第i组的长度
pos[i]=cnt;// 记录第i组在ans中的起始位置
// 把这一组的所有数字存入 ans 数组
for(int j=0;j<l[i];j++)cin>>ans[cnt++];
}
// 第二步:读入每组循环次数
for(int i=0;i<n;i++)cin>>c[i];
// 第三步:依次消耗 k,找到答案
for(int i=0;i<n;i++){
ll len=l[i],sum=c[i]*len;// 本组循环后的总长度
if(k>sum){
k-=sum;// k 比本组总长还大 → 全部跳过
continue;
}
k--;/ 转成 0 下标
// 在本组内循环定位,输出答案
cout<<ans[pos[i]+k%len];
return 0;
}
}
后记
本蒟蒻第一次正式写题解,求谅解,我很菜的
这里空空如也




















有帮助,赞一个