ABC364 题解

A

直接模拟。

注意到 nn 时即使得病也要输出 Yes

#include<bits/stdc++.h>
using namespace std;
int n;
string s,t; 
int main(){
	cin>>n;
	s="";
	for(int i=1;i<=n;i++){
		t=s;
		cin>>s;
		if(s=="sweet"&&t=="sweet"&&i!=n){
			cout<<"No";
			return 0;
		}
	}
	cout<<"Yes";
	return 0;
}

B

模拟即可。

#include<bits/stdc++.h>
using namespace std;
int n,m,x,y;
char ch[55][55];
const int dx[5]={0,0,0,-1,1};
const int dy[5]={0,-1,1,0,0};
int getint(char ch){
	if(ch=='L')return 1;
	if(ch=='R')return 2;
	if(ch=='U')return 3;
	if(ch=='D')return 4;
	return 0;
}
string s;
int main(){
	cin>>n>>m>>x>>y;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>ch[i][j];
		}
	}
	cin>>s;
	for(int i=0;i<s.length();i++){
		int gi=getint(s[i]);
		int nx=x+dx[gi],ny=y+dy[gi];
		if(nx<1||nx>n||ny<1||ny>m)continue;
		if(ch[nx][ny]=='#')continue;
		x=nx;
		y=ny;
	}
	cout<<x<<' '<<y;
	return 0;
}

C

简单贪心。

要么让他吃最多的甜,要么吃最多的咸。

#include<bits/stdc++.h>
using namespace std;
struct node{
	int x,y;
}a[200005];
int n;
long long sum1,sum2,x,y;
int cmp1(node _,node __){
	return _.x>__.x;
}
int cmp2(node _,node __){
	return _.y>__.y;
}
int ans1,ans2;
int main(){
	scanf("%d%lld%lld",&n,&x,&y);
	ans1=n;
	ans2=n;
	for(int i=1;i<=n;i++)scanf("%d",&a[i].x);
	for(int i=1;i<=n;i++)scanf("%d",&a[i].y);
	sort(a+1,a+n+1,cmp1);
	for(int i=1;i<=n;i++){
		sum1+=a[i].x;
		sum2+=a[i].y;
		if(sum1>x||sum2>y){
			ans1=i;
			break;
		}
	}
	sum1=0;
	sum2=0;
	sort(a+1,a+n+1,cmp2);
	for(int i=1;i<=n;i++){
		sum1+=a[i].x;
		sum2+=a[i].y;
		if(sum1>x||sum2>y){
			ans2=i;
			break;
		}
	}
	cout<<min(ans1,ans2);
	return 0;
}

D

二分答案 ansans

aa 数组中二分查找 [bians,bi+ans][b_i-ans,b_i+ans] 的区间。

复杂度带 22 只 log。

注意 rr 初始值为 4×1084\times 10^8

#include<bits/stdc++.h>
using namespace std;
int n,a[200005],m;
struct node{
	int id,x,k,ans;
}b[200005];
int cmp(node _,node __){
	return _.x<__.x;
}
int cmp2(node _,node __){
	return _.id<__.id;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	for(int i=1;i<=m;i++){
		scanf("%d%d",&b[i].x,&b[i].k);
		b[i].id=i;
	}
	n++;
	a[n]=2147483647;
	sort(a+1,a+n+1);
	sort(b+1,b+m+1,cmp);
	for(int i=1;i<=m;i++){
		long long l=0,r=400000000,mid,ans=0;
		while(l<r){
			mid=(l+r)>>1;
			int ll=lower_bound(a+1,a+n+1,b[i].x-mid)-a;
			int rr=lower_bound(a+1,a+n+1,b[i].x+mid+1)-a;
			rr--;
			int len=(rr-ll+1);
			if(len>=b[i].k){
				ans=mid;
				r=mid;
			}
			else l=mid+1;
		}
		b[i].ans=ans;
	}
	sort(b+1,b+m+1,cmp2);
	for(int i=1;i<=m;i++){
		printf("%d\n",b[i].ans);
	}
	return 0;
}

E-G

等我补完再说。

后记

在 ABC364 中,我吸取了以下教训:

  1. 我们要看清数据范围,不要因为 D 的 rr 初始值的错误调半小时。
  2. 我们要注意厕所的使用。
  3. 我们要注意《星芒》的使用。这首歌会让我想到羊守七的小巴,如此勇敢坚强,导致我最后写出了 D。
posted @   Weslie_qwq  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示