入门赛7

来源:互联网 发布:java哪个版本稳定 编辑:程序博客网 时间:2024/05/18 00:50

  • 前言
  • T1 Bachgold Problem
    • 题面
    • 题意
    • 思路
    • 代码
    • 小结
  • T2 Parallelogram is Back
    • 题面
    • 题意
    • 思路
    • 代码
    • 小结
  • T3 Voting
    • 题面
    • 题意
    • 思路
    • 代码
    • 小结
  • T4 Secrets
    • 题面
    • 题意
    • 思路
    • 代码
    • 小结
  • T5 Chips
    • 题面
    • 题意
    • 思路
    • 代码
    • 小结
  • 总结

前言

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 1000using 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

原创粉丝点击