• Codeforces Round #193 (Div. 2) 部分题解


    A:直接判断前三项是否相等

     1 int main()
     2 {
     3     //FIN;
     4     //CHEAT;
     5     int n;
     6     cin>>n;
     7     getchar();
     8     char a[4005];
     9     gets(a);
    10     int len = strlen(a);
    11     int cnt = 0;
    12     for(int i = 0 ; i < len ; i++)
    13     {
    14         if(i % n == 0 && i != 0 )
    15         {
    16             if(a[i-1] == a[i-2] && a[i-2] == a[i-3])
    17                 cnt++;
    18         }
    19     }
    20     cout<<cnt<<endl;
    21     return 0;
    22 }

    B:

    求一遍前缀和O(n).... 用前缀和求一遍所有长度为k的区间和O(n)....

    再从后往前找一遍这些区间的最大值O(n)...并记下从该点到最后的区间最大值...

    然后就从前向后遍历一遍,每次找从i开始的区间和从点i+k之后的最大区间 ,求一次MAX即可 O(n)

    总共还是O(n)...用线段树什么的就别逗了

     1 LL a[200005];
     2 LL sum[200005];
     3 LL sum1[200005];
     4 LL max2[200005];
     5 LL maxe[200005];
     6 int main()
     7 {
     8     //FIN;
     9     //CHEAT;
    10     int n,k;
    11     cin>>n>>k;
    12     for(int i = 1 ; i <= n ; i++)
    13     {
    14         cin>>a[i];
    15         sum[i] = sum[i-1] + a[i];
    16     }
    17     int cnt = 1;
    18     for(int i = 1 ; i <= n-k+1 ; i++)
    19     {
    20         sum1[cnt++] = sum[i+k-1] - sum[i-1];
    21     }
    22     int back = cnt-1;
    23     LL M = -INF;
    24     for(int i = cnt-1 ; i >= 1 ; i--)
    25     {
    26         if(sum1[i] >= M)
    27         {
    28             max2[i] = sum1[i];
    29             maxe[i] = i;
    30             M = sum1[i];
    31         }else
    32         {
    33             max2[i] = M;
    34             maxe[i] = maxe[i+1];
    35         }
    36     }
    37     M = -INF;
    38     int s1=0,s2=0;
    39     for(int i = 1 ; i <= n ; i++)
    40     {
    41         if(max2[i+k] + sum1[i] > M)
    42         {
    43             M = max2[i+k] + sum1[i];
    44             s1 = i;
    45             s2 = maxe[i+k];
    46         }
    47     }
    48     cout<<s1<<" "<<s2<<endl;
    49     return 0;
    50 }

    C:

    先贪心找 b最小a最大的 这是有可能取的任务

    再贪心找 a最大b最大的 这是一定取的k个任务,并求出最小值

    再贪心从剩下的点中 找出b小于最小值的点 ,再贪心找取p-k个b最大a最小的点...

    排三遍序就行了...挺麻烦而且我感觉数据弱了...

     1 struct point
     2 {
     3     int id ;
     4     int s,v;
     5 }x[MAXN],q[MAXN];
     6 int cmp(point a,point b)
     7 {
     8     if(a.v != b.v)
     9         return a.v < b.v;
    10     else return a.s > b.s;
    11 }
    12 int cmp1(point a,point b)
    13 {
    14     if(a.s != b.s)
    15         return a.s > b.s;
    16     else return a.v > b.v;
    17 }
    18 int cmp2(point a,point b)
    19 {
    20     if(a.v != b.v)
    21         return a.v > b.v;
    22     else return a.s < b.s;
    23 }
    24 int main()
    25 {
    26     //FIN;
    27     //CHEAT;
    28     int n,p,k;
    29     cin>>n>>p>>k;
    30     for(int i = 0 ; i < n ; i++)
    31     {
    32         cin>>x[i].s>>x[i].v;
    33         x[i].id = i;
    34     }
    35     sort(x,x+n,cmp);
    36     sort(x+(p-k),x+n,cmp1);
    37 //    for(int i = 0 ; i < n ; i++)
    38 //        cout<<x[i].s<<" "<<x[i].v<<"   "<<x[i].id+1<<endl;
    39 //    cout<<endl;
    40     int M = INF;
    41     for(int i = p-k ;i < p ; i++)
    42         M = min(M,x[i].v);
    43     int cnt = 0 ;
    44     for(int i = 0 ; i < p - k ; i++)
    45         q[cnt++] = x[i];
    46     for(int i = p-1 ; i < n ; i++)
    47         if(x[i].v < M )
    48             q[cnt++] = x[i];
    49     sort(q,q+cnt,cmp2);
    50 
    51     for(int i = p-k ; i < p ; i++)
    52         cout<<x[i].id+1<<" ";
    53     for(int i = 0 ; i < p - k ; i++)
    54         cout<<q[i].id+1<<" ";
    55     cout<<endl;
    56     return 0;
    57 }

    都是赛后做的...赛中做的话又要掉rating真是难过...今天多校也爆0...真是弱的不能多说...

  • 相关阅读:
    js中盒子模型常用的属性你还记得几个?
    编写一个关于浏览器盒子模型的方法
    Javascript中关于作用域和闭包和域解释的面试题
    时间格式转换
    HDU Subset sequence
    bugku never give up
    HDU 2136 Largest prime factor
    HDU 2099 整除的尾数
    杭电acm 2070
    ACM Elevator
  • 原文地址:https://www.cnblogs.com/Felix-F/p/3216191.html
Copyright © 2020-2023  润新知