ABC364 题解
A
直接模拟。
注意到 时即使得病也要输出 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
二分答案 。
在 数组中二分查找 的区间。
复杂度带 只 log。
注意 初始值为 。
#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 中,我吸取了以下教训:
- 我们要看清数据范围,不要因为 D 的 初始值的错误调半小时。
- 我们要注意厕所的使用。
- 我们要注意《星芒》的使用。这首歌会让我想到羊守七的小巴,如此勇敢坚强,导致我最后写出了 D。

浙公网安备 33010602011771号