比赛10 总结

来源:互联网 发布:网络暴力 论文 编辑:程序博客网 时间:2024/06/09 20:27

  • T1
    • 题面
    • 题意
    • 方法
    • 代码
  • T2
    • 题面
    • 题意
    • 代码
  • T3
    • 题面
    • 题意
    • 方法
    • 代码
  • T4
    • 题面
    • 题意
    • 注意点
    • 代码
  • T5
    • 题面
    • 题意
    • 代码
  • T6
    • 题面
    • 题意
    • 代码
  • T7
    • 题面
    • 题意
    • 代码

T1

题面

题意

输入n,和2*n个数。那么是否可以分成两组,使一组的任意一个数比另一个组的所有数都要大。

方法

排序判断中间两个数是否相等。

代码

#include<bits/stdc++.h>using namespace std;int main(){    int i,j,n,a[1005],k=0,l=0;    cin>>n;    for(i=1;i<=2*n;i++)    {        scanf("%d",&a[i]);    }    sort(a+1,a+2*n+1);    if(a[n+1]>a[n])    {        cout<<"YES";    }    else cout<<"NO";}

T2

题面

题意

输入六个数,请问至少进行几次操作可以使前三个数之和等于后面三个数。
操作可以将任意一个数换为另外一个任意数

代码

#include<bits/stdc++.h>using namespace std;string s;int b[7],i,n,j,z,y,ans=0,bl[7],bl2[7],a[7],x;int main(){    cin>>s;    for(i=0;i<=5;i++)    {        b[i+1]=s[i]-48;        bl[i+1]=b[i+1];        bl2[i+1]=9-b[i+1];    }    z=b[1]+b[2]+b[3];    y=b[4]+b[5]+b[6];    if(z==y)    {        cout<<0;        return 0;    }    if(z>y)    {        x=z-y;        for(i=1;i<=6;i++)        {            if(i<=3)            {                a[i]=bl[i];            }            else            {                a[i]=bl2[i];            }        }        sort(a+1,a+7);        for(i=6;i>=1;i--)        {            ans++;            x-=a[i];            if(x<=0)            {                cout<<ans;                return 0;            }        }    }    if(z<y)    {        x=y-z;        for(i=1;i<=6;i++)        {            if(i<=3)            {                a[i]=bl2[i];            }            else            {                a[i]=bl[i];            }        }        sort(a+1,a+7);        for(i=6;i>=1;i--)        {            ans++;            x-=a[i];            if(x<=0)            {                cout<<ans;                return 0;            }        }    }}

T3

题面

题意

有两个电视,要看n个节目,且不能给出n(小于等于2*10^5)和每一个节目的开始时间和结束时间(小于等于10^9),且一个节目结束后要在下一时刻才能看其他节目,问,能否全部看完这几个节目?输出YES或NO。

方法

模拟,一个个节目去判断。

代码

#include<bits/stdc++.h>using namespace std;int n,p=-1,q=-1;struct TV{    int begin,end;}tv[200005];bool cmp(TV x,TV y){    return x.begin<y.begin||(x.begin==y.begin&&x.end<y.end);}int main(){    int i,j;    cin>>n;    for(i=1;i<=n;i++)    {        scanf("%d%d",&tv[i].begin,&tv[i].end);    }    sort(tv+1,tv+n+1,cmp);    for(i=1;i<=n;i++)    {        if(tv[i].begin>p)        {            p=tv[i].end;        }        else if(tv[i].begin>q)        {            q=tv[i].end;        }        else        {            cout<<"NO";            return 0;        }    }    cout<<"YES";}

T4

题面

题意

有六个事件,详见题目。判断去掉几个标志牌才能使他遵守交通规则。

注意点

若超车,则说明在该事件之前直到允许超车的所有不可超车的告示牌都要被拆掉,若调整车速后小于限速,则之前大于该速度的告示牌全部要拆掉。

代码

#include<bits/stdc++.h>using namespace std;int ans=0,kk=0,k[200005],l=0;void shch(int p){    int i;    kk--;    for(i=p;i<kk;i++)    {        k[i]=k[i+1];    }}int main(){    int i,j,v,xv=500,n,m;    cin>>n;    for(i=1;i<=n;i++)    {        scanf("%d",&m);        if(m==1)        {            scanf("%d",&v);            if(v>xv)            {                for(j=kk;j>=1;j--)                {                    if(k[j]>=v)                    {                        xv=k[j];                        break;                    }                    else                    {                        ans++;                        shch(j);                    }                }            }        }        if(m==2)        {            ans+=l;            l=0;        }        if(m==3)        {            scanf("%d",&xv);            if(v>xv)            {                ans++;                continue;            }            kk++;            k[kk]=xv;        }        if(m==4)        {            l=0;        }        if(m==5)        {            xv=500;            kk++;            k[kk]=500;        }        if(m==6)        {            l++;        }    }    cout<<ans;}

T5

题面

题意

代码

T6

题面

题意

代码

T7

题面

题意

代码

原创粉丝点击