题目链接:Codeforces Round #477
心态有点崩,读题太难受了。
A:枚举每个时间之间的查找,看能否起飞即可,注意起飞和降落需要额外两分钟。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=110;
int n,s,sum[N];
struct node{int h,m;}t[N];
signed main(){
cin>>n>>s;
for(int i=1;i<=n;i++) cin>>t[i].h>>t[i].m,sum[i]=t[i].h*60+t[i].m;
if(sum[1]>s) return puts("0 0"),0;
for(int i=1;i<n;i++){
if(sum[i+1]-sum[i]>=s*2+2){
sum[i]+=s+1; cout<<sum[i]/60<<' '<<sum[i]%60<<'\n';return 0;
}
}
sum[n]+=s+1; cout<<sum[n]/60<<' '<<sum[n]%60<<'\n';
return 0;
}
B:从大到小贪心即可。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1e5+10;
int n,A,B,a[N],res;
double s,sum;
signed main(){
cin>>n>>A>>B;
for(int i=1;i<=n;i++) cin>>a[i],sum+=a[i]; sum-=a[1];
s=A*a[1]*1.0/B-a[1]; sort(a+2,a+1+n);
for(int i=n;i>=2;i--){
if(sum<=s) break; sum-=a[i]; res++;
}
cout<<res<<endl;
return 0;
}
C:先特判同一层的情况,然后要么往右,要么往左走,要么电梯要么楼梯,四种情况取最小值即可。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1e5+10;
int q,n,m,cl,ce,v,a[N],b[N],res;
signed main(){
ios::sync_with_stdio(false);
cin>>n>>m>>cl>>ce>>v;
for(int i=1;i<=cl;i++) cin>>a[i];
for(int i=1;i<=ce;i++) cin>>b[i];
cin>>q;
while(q--){
int x1,y1,x2,y2; cin>>y1>>x1>>y2>>x2;
if(y1==y2){cout<<abs(x1-x2)<<'\n'; continue;}
int pos=lower_bound(a+1,a+1+cl,x1)-a; res=1e9;
if(pos!=cl+1) res=abs(x1-a[pos])+abs(x2-a[pos])+abs(y1-y2);
if(pos>1&&cl)
pos--,res=min(res,abs(x1-a[pos])+abs(x2-a[pos])+abs(y1-y2));
pos=lower_bound(b+1,b+1+ce,x1)-b;
if(pos!=ce+1)
res=min(res,abs(x1-b[pos])+abs(x2-b[pos])+(abs(y1-y2)+v-1)/v);
if(pos>1&&ce)
pos--,res=min(res,abs(x1-b[pos])+abs(x2-b[pos])+(abs(y1-y2)+v-1)/v);
cout<<res<<endl;
}
return 0;
}