AT_abc382_c [ABC382C] Kaiten Sushi 题解
题目简述:
有
暴力( 40 pts 左右):
简单分析,
代码:
#include<bits/stdc++.h>
using namespace std;
queue<int>q;
struct node{
int s,id;//美食值与编号
};
vector<node>v;
int n,m;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
int mins=INT_MAX;
for(int i=0;i<n;i++){
int x;
cin>>x;
v.push_back({x,i+1});
mins=min(mins,x);
}//输入,求最小值
for(int i=0;i<m;i++){
int x;
cin>>x;
bool flag=false;
if(x<mins){//特判
cout<<-1<<endl;
continue;
}
for(auto j:v){//遍历美食值
if(j.s<=x){
cout<<j.id<<endl;
flag=true;
break;
}
}
if(!flag){//不满足条件
cout<<-1<<endl;
}
}
}
正片 100 pts 分析
本题看似是一道双指针或二分大题,实际上看到
代码:
#include<bits/stdc++.h>
using namespace std;
map<int,int> xcs;//由于本题数据量,可以简化成一维数组
int lyt[300005];
int n,m;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
memset(lyt,-1,sizeof(lyt));
int mins=INT_MAX;
for(int i=0;i<n;i++){
int x;
cin>>x;
lyt[x]=x;
if(xcs[x]==0){
xcs[x]=i+1;
}
xcs[x]=min(xcs[x],i+1);//特判,如果美食值相同,按编号决定
}
xcs[-1]=1000000;
int cnt=-1;
for(int i=0;i<=300000;i++){//预处理食用区间,类似于桶
if(lyt[i]>xcs){//判断美食值
if(xcs[cnt]>xcs[lyt[i]]){//美食值不同,判断编号
cnt=lyt[i];
}
}
lyt[i]=cnt;
}
for(int i=0;i<m;i++){//最后的输入
int x;
cin>>x;
if(lyt[x]==-1){
cout<<-1<<endl;
continue;
}else{
cout<<xcs[lyt[x]]<<endl;
}
}//完成!
}