A:模拟题,每次进站加上应该要的时间和延迟的时间
每次等待的时候需要题给定的两个条件都满足。
注意:最后一站不需要等待,所以需要单独考虑。
1 #include<cstring> 2 #include<algorithm> 3 #include<iostream> 4 using namespace std; 5 const int N=110; 6 int a[N],b[N],tm[N]; 7 int main(void){ 8 int t; 9 cin>>t; 10 while(t--){ 11 int n; 12 cin>>n; 13 for(int i=1;i<=n;i++){ 14 cin>>a[i]>>b[i]; 15 } 16 for(int i=1;i<=n;i++){ 17 cin>>tm[i]; 18 } 19 int res=0; 20 for(int i=1;i<n;i++){ 21 //进站 22 res=res+a[i]-b[i-1]+tm[i]; 23 //等待 24 res+=(b[i]-a[i]+1)/2; 25 if(res<b[i]) res=b[i]; 26 } 27 res=res+a[n]-b[n-1]+tm[n]; 28 cout<<res<<endl; 29 } 30 return 0; 31 }
B:常规差分问题。
1 #include<cstring> 2 #include<algorithm> 3 #include<iostream> 4 using namespace std; 5 const int N=2e5+10; 6 int res[N]; 7 int main(void){ 8 int t; 9 cin>>t; 10 while(t--){ 11 memset(res,0,sizeof(res)); 12 int n; 13 cin>>n; 14 for(int i=1;i<=n;i++){ 15 int q; 16 cin>>q; 17 int t=max(0,i-q+1); 18 res[t]+=1; 19 res[i+1]-=1; 20 } 21 for(int i=1;i<=n;i++){ 22 res[i]+=res[i-1]; 23 if(res[i]>0) cout<<1<<" "; 24 else cout<<0<<" "; 25 } 26 cout<<endl; 27 } 28 return 0; 29 }
C:必须参照区间DP的枚举方法,枚举线段长度和起点,不然会被一个全1的数据卡。(其实具体的我也不明白)
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 const int N=2e5+10; 5 const int M=5e6+10; 6 typedef pair<int,int> PII; 7 vector<PII> v[M]; 8 int a[N]; 9 int main(void){ 10 int n; 11 cin>>n; 12 for(int i=1;i<=n;i++) cin>>a[i]; 13 for(int i=1;i<=n;i++){ 14 for(int j=1;i+j<=n;j++){ 15 int t=a[i+j]+a[j]; 16 for(auto x:v[t]){ 17 if(x.first!=i+j&&x.first!=j&&x.second!=i+j&&x.second!=j){ 18 puts("YES"); 19 printf("%d %d %d %d\n",i+j,j,x.first,x.second); 20 return 0; 21 } 22 } 23 v[t].push_back({i+j,j}); 24 } 25 } 26 puts("NO"); 27 return 0; 28 }