第七周学习记录

K-th Nearest

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
好神奇,这道题竟然要用二分答案做QAQ;
二分距离,然后check符合要求的点的个数QAQ;

还有一个令人十分难过的点:就是在二分的时候,r取值要足够大才行;

#include <bits/stdc++.h>
using namespace std;

const long long N=1e5+12;
long long a[N];

bool check(long long xmid,long long b,long long n,long long k)
{
	int l=lower_bound(a+1,a+n+1,b-xmid)-a;
	int r=upper_bound(a+1,a+n+1,b+xmid)-a;
	return r-l>=k; 
}
long long search_min(long long b,long long k,long long n)
{
	long long l=0,r=1e18,mid;
	while(l<r){
		mid=l+r>>1;
		if(check(mid,b,n,k))	r=mid;
		else	l=mid+1;	
	}
	return r;
}
int main()
{
	long long n,q;
	cin>>n>>q;
	for(long long i=1;i<=n;i++)
		cin>>a[i];
	sort(a+1,a+n+1);
	while(q--)
	{
		long long b,k;
		cin>>b>>k;
		long long ans=search_min(b,k,n);
		cout<<ans<<endl;
	}
	return 0;
}

跳石头

在这里插入图片描述
在这里插入图片描述
依然是二分答案QAQ
二分距离,通过check判断需要取走的石头的个数QAQ

其中check部分,mid是此时间距的最大值,如果两个石头之间的距离不到最大值就可以把这块石头取走QwQ,然后就可以统计取走的石头数来作比较啦QWQ;

#include <bits/stdc++.h>
using namespace std;

const int N=5e4+12;
int a[N]={};

bool check(int mid,int m,int n)
{
	int y=0,k=0;
	for(int i=1;i<=n+1;i++){
		if(a[i]-a[k]<mid)
			y++; 
		else	k=i;
	}
	return y<=m;
}
int search_max(int L,int m,int n)
{
	int l=1,r=L,mid;
	while(l<r){
		mid=l+r+1>>1;
		if(check(mid,m,n))	l=mid;
		else	r=mid-1;
	}
	return l;
}
int main()
{
	int L,n,m;
	cin>>L>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	a[n+1]=L;
	int ans=search_max(L,m,n);
	cout<<ans;
	return 0;
}

Trophy

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

要用前缀和QWQ;
但是有个小小的问题,在取minn的时候要把范围开到好大好大才可以,因为它真的有可能2e5组数据全是1e9QWQ;

#include <bits/stdc++.h>
using namespace std;

#define int long long
const long long N=2e5+12;

int a[N]={},b[N]={},s[N]={},a1[N]={};
signed main() 
{
	int n,x;
	cin>>n>>x;
	for(int i=1;i<=n;i++){
		cin>>a[i]>>b[i];
		a1[i]=a[i]+b[i];
	}
	for(int i=1;i<=n;i++){
		s[i]=s[i-1]+a1[i];
	}
	int minn=2e18;//就是这里,要开好大才行QAQ;
	for(int i=1;i<=min(x,n);i++){
		if(i!=1) b[i]=min(b[i],b[i-1]);
		int m=s[i]+(x-i)*b[i];
		if(m<minn){
			minn=m;
		}	
	}
	cout<<minn;
	return 0;
}

Rotation

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
似乎是通过改变对于首位置的标记来达到移动字符串的效果(

(怎么感觉有点类似于物理里边的相对运动QAQ

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int n,q;
	cin>>n>>q;
	string s;
	cin>>s;
	int head=0;
	while(q--)
	{
		int t,x;
		cin>>t>>x;
		if(t==1){
			head=(head+n-x)%n;
		}
		if(t==2){
			cout<<s[(head+x-1)%n]<<endl;
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值