比赛7 总结

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 200010
using 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 long
using 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 long
using 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 1001
using 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值