题意: 解法: dp. 令d[i]表示前i次需要的最小花费, 转移方程: 1.d[i]=d[i-1]+20. 2.d[i]=d[p1]+50,其中a[p1]<t[i]-90+1. 3.d[i]=d[p2]+120,其中a[p2]<t[i]-1440+1. 找p1和p2可以二分,因为t[]是有序的. code: #include<bits/stdc++.h> #define int long long using namespace std; const int maxm=1e6+5; int d[maxm]; int a[maxm]; int n; int ask(int l,int r,int x){ int ans=0; while(l<=r){ int mid=(l+r)/2; if(a[mid]<x){ ans=mid,l=mid+1; }else{ r=mid-1; } } return ans; } void solve(){ cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } for(int i=1;i<=n;i++){ d[i]=d[i-1]+20; d[i]=min(d[i],d[ask(1,i-1,a[i]-90+1)]+50); d[i]=min(d[i],d[ask(1,i-1,a[i]-1440+1)]+120); } for(int i=1;i<=n;i++){ cout<<d[i]-d[i-1]<<endl; } } signed main(){ ios::sync_with_stdio(0);cin.tie(0); solve(); return 0; }