• Codeforces Round #707


    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
    ",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 }
  • 相关阅读:
    Python中变量的作用域
    Python中关于函数的介绍
    python列表中的赋值与深浅拷贝
    Python中关于集合的介绍及用法
    python中文件操作的六种模式及对文件某一行进行修改的方法
    python中文件操作的其他方法
    python中文件操作的基本方法
    python中字符串的一些用法
    python里字典的用法介绍
    小谈python里 列表 的几种常用用法
  • 原文地址:https://www.cnblogs.com/greenofyu/p/14534750.html
Copyright © 2020-2023  润新知