入门赛7

前言

AK啦啦啦~~~~!!!!!

本题涉及题目:
A: [Bachgold Problem]

B: [Parallelogram is Back]

C: [Voting]

D: [Secrets]

E: [Chips]


T1 Bachgold Problem

题面

原题地址: [A]

题意

将一个数分解成若干个质数,使质数的个数最多

思路

偶数输出2,奇数输出2和一个3。

代码

#include<bits/stdc++.h>
using namespace std;
int n;
int main()
{
    scanf("%d",&n);
    printf("%d\n",n/2);
    if(n&1)
    {
        for(int i=1;i<=n/2-1;i++)
        {
            printf("2 ");
        }
        printf("3");
    }
    else
    {
        for(int i=1;i<=n/2;i++) printf("2 ");
    }
    return 0;
}

小结

水题*1


T2 Parallelogram is Back

题面

原题地址: [B]

题意

给出三个点,求以这三个点为顶点的平行四边形的第四个点。

思路

暴力,公式。

代码

#include<bits/stdc++.h>
using namespace std;
int x1,x2,x3,y11,y2,y3;
int main()
{
    scanf("%d%d%d%d%d%d",&x1,&y11,&x2,&y2,&x3,&y3);
    printf("3\n");
    printf("%d %d\n",x1-x2+x3,y11-y2+y3);
    printf("%d %d\n",x1+x2-x3,y11+y2-y3);
    printf("%d %d\n",x2+x3-x1,y2+y3-y11);
    return 0;
}

小结

水题*2


T3 Voting

题面

原题地址: [C]

题意

每个D都可以杀掉其后面的任意一个R,从1~n重复执行,直到有一方死绝。

思路

由于每一步都是最优,所以D只会杀掉其后面的第一个R。
于是可以组两个队列,队列开头的D必定会杀掉队列开头的R(或R杀D),由于重复执行,所以D杀完R后又要到队列末尾。

代码

#include<bits/stdc++.h>
using namespace std;
queue<int> D,R;
int n,i,d,r;
char c;
int main()
{
    for(scanf("%d\n",&n),i=0;i<n;i++) scanf("%c",&c),c=='D'?D.push(i):R.push(i);
    while(!D.empty()&&!R.empty())
    {
        d=D.front(),r=R.front();
        D.pop(),R.pop();//以出现的顺序决定生死;
        d<r?D.push(n+d):R.push(n+r);//+n是放到队尾后将顺序值提高;
    }
    D.empty()?printf("R"):printf("D");//看看哪方over了;
    return 0;
}

小结

水题*3


T4 Secrets

题面

原题地址: [D]

题意

你只能用一种硬币,且不能刚好凑出n,使使用硬币个数最大。
硬币面值为1,3,3^2,3^3,……

思路

找出n不能整除的最小硬币面值,然后全部用这个硬币。

代码

#include<bits/stdc++.h>
using namespace std;
long long n,a=3;
int main()
{
    scanf("%lld",&n);
    while(!(n%a)) a*=3;
    printf("%lld",n/a+1);
    return 0;
}

小结

水题*4


T5 Chips

题面

原题地址: [E]

题意

有一个n*n个棋盘,你有无数个棋子,有k个坏点,棋子是能从一条边到对边(棋盘的角不能放),不能经过坏点。

思路

行数组和列数组储存列和行的第i个能不能放棋子。

代码

#include<bits/stdc++.h>
#define N 1000
using namespace std;
int n,i,x,y,ans,k;
bool X[N+5],Y[N+5];
int main()
{
    memset(X,true,sizeof(X));
    memset(Y,true,sizeof(Y));
    for(scanf("%d%d",&n,&k),i=0;i<k;i++)
    {
        scanf("%d%d",&x,&y);
        X[x]=false;
        Y[y]=false;
    }
    for(i=2;i<n;i++)
    {
        if(X[i]) ans++;
        if(Y[i]) ans++;
    }
    if(n&1&&X[(n+1)>>1]&&Y[(n+1)>>1]) ans--;//只有n为单数时中间的列和行有可能撞到。
    printf("%d",ans);
    return 0;
}

小结

水题*5


总结

水题*n

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值