czl蒻蒟的OI之路6

  • XJOI奋斗群蒻蒟群群赛7 RANK排名4
      • T1Bachgold Problem WA一次后AC
          • 题意
          • 分析过程
          • 给出题解
      • T2Parallelogram is Back WA一次后AC
          • 题意
          • 分析过程
          • 给出题解
      • T3Voting WA一次后AC
          • 题意
          • 分析过程
          • 给出题解
      • T4Secrets 已AC
          • 题意
          • 分析过程
          • 给出题解
      • T5Chips已AC
          • 题意
          • 分析过程
          • 给出题解
      • 蒻蒟的总结

—>XJOI奋斗群(蒻蒟群)群赛7<— RANK排名4

T1:Bachgold Problem (WA一次后AC)

题意:

给你一个数,让你把这个数拆成若干个质数,输出能够拆分成的质数的个数与所有的质数。

分析过程:

典型的水题,要想拆分的个数多,那么拆分成的质数一定要小。想到小的质数,就会想到2和3。所以只要判断给出的数是奇数还是偶数,如果是偶数,就输出n/2个2,如果是奇数,就输出n/2-1个2,再输出一个3就行了。然而错了一次,纯属失误,少打了它能够分成的质数的个数。

给出题解:
#include
using namespace std;

int main()
{
    int n,ans;
    cin>>n;
    if(n%2==0)
    {
        ans=n/2;
        cout<for(int i=1;i<=ans;i++)cout<<2<<" ";
    }
    else 
    {
        ans=(n-1)/2;
        cout<for(int i=1;i<=ans-1;i++)cout<<2<<" ";
        cout<<3;
    }
}

T2:Parallelogram is Back (WA一次后AC)

题意:

又是一道水题,简单来说,就是给你一个平行四边形的三个点,让你输出第四个点的可能的个数,并输出这几个点。

分析过程:

作为常识,一个平行四边形给出你三个点,第四个点共有三个位置可以选择。然后根据平行四边形的性质去求就行了。然而我还是错了一次,又是忘记打了个数,满心MMP。

给出题解:
#include
using namespace std;

int main()
{
    int x1,x2,x3,y1,y2,y3,x,y;
    cin>>x1>>y1>>x2>>y2>>x3>>y3;
    int chax,chay;
    cout<<3<cout<" "<cout<" "<cout<" "<

T3:Voting (WA一次后AC)

题意:

简单来说,就是给你n个字母,分别是D和R,按顺序排,每个人可以干掉他之后的任意一个人,被干掉的人就不能做其他事了。让你求最后只剩下一个人时,是哪个字母留下。(当然,D的人会去干R,R也一样)。

分析过程:

刚开始想要用数组去解,结果发现比较难解决移除字母的操作,用BOOL型又会TLE,所以就想到了刚学的队列。只要设两个队列,一个用来存D,另一个存R。每次取出每个队列的首数据,进行比较,如果R的排名在D前,那么把D弹出队列,把R排到该队列队尾,重复这个操作,知道一个队列为空,另一个队列就是所求。

给出题解:
#include
using namespace std;

int main()
{
    char st[200010];
    queue <int> d,r;
    int n;
    cin>>n;
    scanf("%s",st);
    for(int i=0; iif(st[i]=='D')d.push(i);
        else r.push(i);
    }
    while(!r.empty()&&!d.empty())
    {
        int a = r.front();
        int b = d.front();
        if(a < b)
        {
            r.pop();
            d.pop();
            r.push(a+n);
        }
        else
        {
            d.pop();
            r.pop();
            d.push(n+b);
        }
    }
    if(r.empty()==false) cout<<"R";
    else cout<<"D";
    return 0;
}

T4:Secrets (已AC)

题意:

首先有一堆硬币,面值是3的n次方:1,3,9,27……,然后给你一个数n,让你用硬币去换,条件是:
你用硬币要尽可能的大于n并且最接近n;
你用的硬币数量要尽可能的多;
问要多少个硬币换取。

分析过程:

简单来说,就是分这个数是否是3的倍数来写。如果不是三的倍数,就一直用3元去换。如果是三的倍数,就一直去寻找一个3^k的数,使得这个数不是3^k的倍数,然后用这个数去除以3^k+1,就是答案。

给出题解:
#include
using namespace std;

int main()
{
    long long int n,t;
    long long int cnt=0;
    cin>>n;
    if(n%3!=0)
    {
        cnt=n/3+1;
    }
    else 
    {
        t=3*3;
        while(t)
        {

        if(n%t!=0){cnt=n/t+1;break;}
        else 
        {
            t=t*3;
        }
        }
    }
    cout<

T5:Chips(已AC)

题意:

给你一个n*n的矩阵,然后其中有一些坏点。你需要在边框上(不包括角落)放几个棋子,让他通过n-1次走到他的对面。同时,要满足在这个行进路程中,不能有一个点,两个棋子走到同一个格子,并且不能交换两个棋子(就是一行或一列里只能有一个棋子),而且棋子不能走到坏点上。让你求最大能够放的棋子的个数。

分析过程:

首先,它一旦给出一个换点,说明这个点所在的行和列都不能放棋子了(因为棋子只能直着走)。然后定义一个数组来判断每一行和列上是否有坏点,有就变成1,没有就为0。然后从i=2开始遍历到n-1(因为不包括角落),如果行和列加起来等于0(说明行和列都没有坏点)这时只需判断n的奇偶性和i的大小,当n为奇数,并且i=(n+1)/2,那么只能放一个棋子,其余的都能放两个棋子。如果行和列加起来等于1(说明行或列上只有一个坏点),那么就只能放一个棋子。如果加起来等于2(说明行和列上有两个坏点),就一个都不能放了。最后输出总共能放的棋子个数。

给出题解:
#include
using namespace std;

int main()
{
    long long int n,t;
    long long int cnt=0;
    cin>>n;
    if(n%3!=0)
    {
        cnt=n/3+1;
    }
    else 
    {
        t=3*3;
        while(t)
        {

        if(n%t!=0){cnt=n/t+1;break;}
        else 
        {
            t=t*3;
        }
        }
    }
    cout<

蒻蒟的总结:

今天终于AK了一次了啊,虽然题目是有点简单的。不过还是有一点不好,就是AB这两道水题,我竟然都因为少打出了数据而WA了一次,真的是不甘心。(不过好像减了这40分的罚分,我还是第4的说)。所以下次绝对不能犯这样的错了,虽然说AB这种水题马上就要离我们而去了。
继续贴出吴老师的话:学信息的人永不服输!!!

你可能感兴趣的:(蒟蒻OI之路)