洛谷新手村p1008三连击

P1008 三连击

题目背景

本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。

题目描述

将1,2, \cdots ,91,2,⋯,9共99个数分成33组,分别组成33个三位数,且使这33个三位数构成1:2:31:2:3的比例,试求出所有满足条件的33个三位数。

输入输出格式

输入格式:

木有输入

输出格式:

若干行,每行33个数字。按照每行第11个数字升序排列。

输入输出样例

输入样例#1: 复制

输出样例#1: 复制

192 384 576
* * *
...

* * *
(输出被和谐了)

入坑2天,遇到这么一个题自己一开始用暴力法去做确实是很好写的但是奈何约束条件十分麻烦无奈之下看了题解。

嗯,仔细思考了一下吸取到了别人的精髓。

#include <iostream>
#include<string.h>
using namespace std;

int main()
{
    int arr[10];
    int ans1,ans2,ans3;
    int a1,a2,a3;
    int flag;
    for(int i=123;i<987/3;i++)//因为三个数分别是 i,2i,3i  所以如果i的最大值只能是987/3
    {
        a1=i;
        a2=2*i;
        a3=3*i;//分别对a1,a2,a3进行赋值
        ans1=a1;
        ans2=a2;
        ans3=a3;//下面对a1,a2,a3进行操作会导致a1,a2,a3的值发生变化,所以要用ans1,ans2,ans3来保存值
        int flag=0;//标志 如果为0就说明1-9每个数都取到了
        memset(arr,0,sizeof(arr));

        while(a1>0) // 整个代码的灵魂个人觉得写得最精彩的一部分
        {
            arr[a1%10]++;   //arr[1]-arr[9]都取到了就是1   且不能重复,有重复的话值就比1大,没取到的话值就比1小
            a1=a1/10;//为了取到个位十位百位
        }
        while(a2>0)
        {
            arr[a2%10]++;
            a2=a2/10;
        }
        while(a3>0)
        {
            arr[a3%10]++;
            a3=a3/10;
        }
        for(int j=1;j<=9;j++)
        {
            if(arr[j]!=1)//只有arr[j]==1  才能说明每个值都取到了的而且值不重复!
            {
                flag=1;//标志为1
            }
        }
        if(flag==0)//只有标志为0才是正确答案
        {
            cout<<ans1<<" "<<ans2<<" "<<ans3<<endl;
        }

    }
    return 0;
}

解毕!

感悟:读大三了,很早前就知道acm一直不敢去尝试,其实自己做了后发觉:的确,这个东西是挺难的,但是任何东西都是有一个过程的。

想要变强但是又不敢迈出第一步,

迈出第一步又坚持不下去,

怎么会成功呢?

第一次写博客,有点鸡汤了。

望共勉!

猜你喜欢

转载自blog.csdn.net/hggkjt/article/details/83036397