zoukankan      html  css  js  c++  java
  • ECJTUACM16 Winter vacation training #5 题解&源码

    A-------------------------------------------------------------------------------------------

    题目链接:http://codeforces.com/problemset/problem/714/A

    解题思路:

    【题意】

    Sonya每天只有[l1,r1]时间段内空闲,且在k时刻,她要打扮而不能够见Filya

    Filya每天[l2,r2]时间段内空闲

    问他们俩每天有多少时间能够在一起

    【类型】
    区间交

    【分析】

    显然,要求他们俩每天有多少时间在一起

    其实就是求两区间的交集

    那无外乎就是对两区间的位置关系进行分析




    ,。当然还有几个图这里就不一一列举了,主要就是找到两个的

    相交区间,然后判断k是否在这个区间中,在的话减一;

    这道题要用long long,否则会超!

    下面给出AC代码:

     

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 int main()
     5 {
     6     ll l1,l2,r1,r2,k;
     7     while(cin>>l1>>r1>>l2>>r2>>k)
     8     {
     9         ll minn=min(r1,r2);
    10         ll maxn=max(l1,l2);
    11         ll ans=minn-maxn+1;
    12         if(maxn>minn)
    13         {
    14             cout<<0<<endl;
    15             continue;
    16         }
    17         if(k>=maxn&&k<=minn)
    18             ans--;
    19         cout<<ans<<endl;
    20     }
    21     return 0;
    22 }

     

    B-------------------------------------------------------------------------------------

    题目链接:http://codeforces.com/problemset/problem/716/A

    题目大意:

      给你一个N(N<=100000)个字母敲击的时间a[i](a[i]<=109),如果在M时间内没有敲击那么屏幕就清零,否则屏幕上就多一个字母,问最后屏幕剩下几个字母。

        打下下一个字母的时候,如果和之前字母打下的时间不超过k的话,则保留前面的继续打,如果超过了,则前面的字母全部消失,只留下这一个字母。

         下面给出AC代码:

     

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int main()
     4 {
     5     int a[100005];
     6     int n,t;
     7     while(scanf("%d%d",&n,&t)!=EOF)
     8     {
     9         for(int i=0;i<n;i++)
    10             scanf("%d",&a[i]);
    11             int ans=1;
    12         for(int i=0;i<n-1;i++)
    13         {
    14             if(a[i+1]-a[i]<=t)
    15             ans++;
    16             else ans=1;
    17         }
    18         printf("%d
    ",ans);
    19     }
    20     return 0;
    21 }

     

    C----------------------------------------------------------------------------------------------

    题目链接:http://codeforces.com/problemset/problem/719/A

    分析:当时这题还懵了一阵子,之前好像比赛写过,之前直接去取最后两项去比较,WA...心酸!后来看了下题目才发现,得看到临界点0,15,发现这题目很简单!直接做就是了!

    下面给出AC代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int main()
     4 {
     5     int n,i;
     6     int a[100];
     7     while(cin>>n)
     8     {
     9         for(i=1;i<=n;i++)
    10             cin>>a[i];
    11         if(n==1&&a[n]!=15&&a[n]!=0)
    12             cout<<-1<<endl;
    13         else if(a[n]==15)
    14             cout<<"DOWN"<<endl;
    15         else if(a[n]==0)
    16             cout<<"UP"<<endl;
    17         else if(a[n]<15&&a[n]>a[n-1])
    18         cout<<"UP"<<endl;
    19         else if(a[n]<15&&a[n]<a[n-1])
    20             cout<<"DOWN"<<endl;
    21     }
    22     return 0;
    23 }

    D-------------------------------------------------------------------------------------------

    题目链接:http://codeforces.com/problemset/problem/719/B

    分析:细想只有两种模式,一种brbrbr... 另一种rbrbrb... 只需要统计这两种模式下,需要的两种操作数中最小的一个,即是答案。

    下面给出AC代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int MAXN = 100005;
     4 char a[MAXN];
     5 int main()
     6 {
     7     int n;
     8     while(cin>>n)
     9     {
    10         scanf("%s",a);
    11         int m = 0;
    12         int t=0;
    13         int u=0;
    14         int v=0;
    15         for(int i=0; i<n; i++)
    16         {
    17             if(i%2==0)
    18             {
    19                 if(a[i]=='r')
    20                     m++;
    21                 if(a[i]=='b')
    22                     t++;
    23             }
    24             else
    25             {
    26                 if(a[i]=='r')
    27                     u++;
    28                 if(a[i]=='b')
    29                     v++;
    30             }
    31         }
    32         int x=max(t,u);
    33         int y=max(m,v);
    34         int z=min(x,y);
    35         printf("%d
    ",z);
    36     }
    37     return 0;
    38 }

    E-------------------------------------------------------------------------------------------

    分析:

    威佐夫博弈

    威佐夫博弈(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。

    如果甲面对(0,0),那么甲已经输了,这种局势我们称为奇异局势。前几个奇异局势是:(0,0)、(1,2)、(3,5)、(4,7)、(6,10).可以看出,a0=b0=0,ak是未在前面出现过的最小自然数,而 bk=ak+k.

        那么任给一个局势(a,b),怎样判断它是不是奇异局势呢?我们有如下公式:

        ak =[k(1+√5)/2],bk= ak + k  (k=0,1,2,...,n 方括号表示取整函数)

    奇妙的是其中出现了黄金分割数(1+√5)/2 = 1。618...,因此,由ak,bk组成的矩形近似为黄金矩形,由于2/(1+√5)=(√5-1)/2,可以先求出j=[a(√5-1)/2],若a=[j(1+√5)/2],那么a = aj,bj = aj + j,若不等于,那么a = aj+1,bj+1 = aj+1+ j + 1,若都不是,那么就不是奇异局势。然后再按照上述法则进行,一定会遇到奇异局势。

    下面给出AC代码:

     

     1 #include <iostream>
     2 #include <cmath>
     3 #include <stdio.h>
     4 using namespace std;
     5 int main()
     6 {
     7     int a,b;
     8     int k;
     9     int t;
    10     int a1;
    11     while(~scanf("%d%d",&a,&b))
    12     {
    13         if(a>b)
    14         {
    15            t=a;
    16            a=b;
    17            b=t;
    18         }
    19         k=b-a;
    20         a1=(int)((double)(sqrt(5.0)+1)/2*k);
    21         if(a1==a)
    22             printf("0
    ");
    23         else printf("1
    ");
    24     }
    25     return 0;
    26 }

     

     

  • 相关阅读:
    常见的灰度发布系统规则
    golang中的路由分组
    艾森豪威尔矩阵
    列文定理
    吃狗粮定理
    mysql事务 锁
    mysql中explain优化分析
    mysql hash索引优化
    各种浏览器内核介绍
    浏览器 兼容性问题总结
  • 原文地址:https://www.cnblogs.com/ECJTUACM-873284962/p/6416041.html
Copyright © 2011-2022 走看看