比赛7 总结

来源:互联网 发布:比淘宝便宜又好的网站 编辑:程序博客网 时间:2024/05/16 15:43

  • T1
    • 题面
    • 题意
    • 方法
    • 代码
  • T2
    • 题面
    • 题意
    • 方法
    • 代码
  • T3
    • 题面
    • 题意
    • 方法
    • 队列使用方法
    • 超时的模拟代码链表实现
    • 代码
  • T4
    • 题面
    • 题意
    • 方法
    • 代码
  • T5
    • 题面
    • 题意
    • 方法
    • 代码

T1

题面

题意

输入一个数,输出最多个质数,使和为该数。

方法

尽量多打2,奇数则再加一个3.

代码

#include<bits/stdc++.h>using namespace std;int main(){    int n,i,k;    cin>>n;    k=n/2;    if(n%2==1)    {        cout<<k<<endl<<3;        for(i=1;i<=k-1;i++)        {            cout<<" "<<2;        }    }    else    {        cout<<k<<endl;        for(i=1;i<=k;i++)        cout<<2<<" ";    }}

T2

题面

题意

输入三个点的坐标,输出n和n个坐标,使四个点构成平行四边形。

方法

用其中两坐标之和等于其余两坐标之和的性质来做(平行四边形的对角线互相平分)

代码

#include<bits/stdc++.h>using namespace std;int main(){    int x,y,x2,y2,x3,y3,x4,y4;    cin>>x>>y>>x2>>y2>>x3>>y3;    cout<<3<<endl;    x4=x+x2-x3;    y4=y+y2-y3;    cout<<x4<<" "<<y4<<endl;    x4=x-x2+x3;    y4=y-y2+y3;    cout<<x4<<" "<<y4<<endl;    x4=-x+x2+x3;    y4=-y+y2+y3;    cout<<x4<<" "<<y4<<endl;}

T3

题面

题意

输入n和n个字符D或R,循环进行杀人,D让第一个R删去。

方法

让D和R的序号分别入D,R两队列.分别出一个数,较小数+n后入原队列.
再判断两队列是否为空,输出非空的队列

队列使用方法

用queue<>来定义,<>内写队列内的数据类型,如int.
1.队列D.push(x)表示x如D队列.
2.D.pop()表示删去队首.
3.D.front()表示队首.
4.D.empty()是bool型的,true表示队列为空.

超时的模拟代码(链表实现)

#include<bits/stdc++.h>#define ll long long#define N 200010using namespace std;int b[N],c[N];int main(){    int len,x=0,y=0,tx=0,ty=0,i,n;    string a;    cin>>len;    cin>>a;    if(len==1)    {        cout<<a;        return 0;    }    for(i=0;i<=len-1;i++)    {        if(a[i]=='D') x++;        b[i]=i+1;        c[i]=i-1;    }    b[len-1]=0;    c[0]=len-1;    y=len-x;    n=0;    while(1)    {        if(a[n]=='D')        {            if(tx==0)            {                y--;                ty--;            }            else            {                tx++;                c[b[n]]=c[n];                b[c[n]]=b[n];            }        }        else if(a[n]=='R')        {            if(ty==0)            {                x--;                tx--;            }            else            {                ty++;                c[b[n]]=c[n];                b[c[n]]=b[n];            }        }        if(x==0)        {            cout<<"R";            return 0;        }        else if(y==0)        {            cout<<"D";            return 0;        }        n=b[n];    }}

代码

#include<bits/stdc++.h>#define ll long longusing namespace std;queue<int> D,R;int main(){    int n,x,y,i;    char a;    cin>>n;    for(i=1;i<=n;i++)    {        cin>>a;        a=='D'?D.push(i):R.push(i);        //"?"和":"的用法  "?"为条件,满足则执行"?"与":"间的操作.不满足则执行":"后的操作    }    while(D.empty()==false&&R.empty()==false)    {        x=D.front();y=R.front();        D.pop();R.pop();        x<y?D.push(x+n):R.push(y+n);    }    D.empty()?cout<<"R":cout<<"D";}

T4

题面

题意

输入n,输出k,使(3^l)*k大于n,且n%(3^l)不为0.
要在(3^l)*k-n的值最小的情况下,k尽可能大.

方法

用while算出l的最小值,输出n/(3^l)+1即可.

代码

#include<bits/stdc++.h>#define ll long longusing namespace std;int main(){    ll n,k=3,i=1,j,m,ans=0;    cin>>n;    while(n%k==0)    {        k*=3;    }    cout<<n/k+1;}

T5

题面

题意

在n*n的正方形的边缘上有一些细胞,它们都要去另一边,每秒一格,且有m个坏点,行动时不能碰到坏点和其余细胞,则最多放几个细胞.

方法

用两个初值均为true的bool数组表示行和列,若与坏点有一坐标相同则变为false.
若n为奇数,则判断中间行和中间列,若均为true,则ans–.因为两细胞必然相撞.
其余行列的细胞若会向撞,则可将它换到正方形的另外一段.

代码

#include<bits/stdc++.h>#define ll long long#define N 1001using namespace std;ll n,m;bool hang[N],lie[N];int main(){    ll i,j,x,y,ans=0;    cin>>n>>m;    memset(hang,true,sizeof(hang));    memset(lie,true,sizeof(lie));    for(i=1;i<=m;i++)    {        cin>>x>>y;        lie[y]=hang[x]=false;    }    for(i=2;i<=n-1;i++)    {        if(hang[i]==true) ans++;        if(lie[i]==true) ans++;    }    if(n%2==1)    {        if(hang[n/2+1]==true&&lie[n/2+1]==true) ans--;     }    cout<<ans;}
原创粉丝点击