1. 程式人生 > >洛谷新手村p1008三連擊

洛谷新手村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一直不敢去嘗試,其實自己做了後發覺:的確,這個東西是挺難的,但是任何東西都是有一個過程的。

想要變強但是又不敢邁出第一步,

邁出第一步又堅持不下去,

怎麼會成功呢?

第一次寫部落格,有點雞湯了。

望共勉!