「题解」「NOIP1998 普及组」 三连击

虹棠包
2023-07-13 / 0 评论 / 22 阅读 /
温馨提示:
本文最后更新于2024年01月02日,已超过490天没有更新,若内容或图片失效,请留言反馈。

好久没做题了啊
没想到栽到这了。。。
记录于此,警示于己

题目背景

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

题目描述

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

输入格式

输出格式

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

样例 #1

样例输入 #1

样例输出 #1

192 384 576
* * *
...

* * *
(剩余部分不予展示)

然后,我非常弱智的写了这个↓

#include<stdio.h>
int main()
{
    int all[800],tem = 0;
    for(int i = 1;i <= 9;i++)
    {
        for(int j = 1;j <= 9;j++)
        {
            for(int k = 1;k <= 9;k++)
            {
                all[tem] = i * 100 + j * 10 + k;
                tem++;
            }
        }
    }
    for(int i = 1;i <= tem-2;i++)
    {
        for(int j = i + 1;j <= tem-1;j++)
        {
            for(int k = j + 1;k <= tem;k++)
            {
                if(all[i] * 3 == all[j] * 2 && all[j] * 2 == all[k])
                    printf("%d %d %d\n",all[i],all[j],all[k]);
            }
        }
    }
    return 0;
}

其实挺简单的,不解释了,AC代码↓
肯定还有更简洁的代码,但。。。懒

#include<stdio.h>
int dcp[9];
bool find(int n,int tem)
{
    for(int i=1;i<=tem;i++)
    {
        if(dcp[i]==n)
            return true;
    }
    return false;
}
int main()
{
    bool flag=false;
    int num=192,numt;
    for(int i = 1;i <= 136;i++)
    {
        for(int j=0;j<=10;j++)
            dcp[j] = 0;
        if(num*2<=981 && num*3<=981)
        {
            numt = num*1000000+num*2000+num*3;
            for(int tem=1;tem<=9;tem++)
            {
                if(find(numt%10,tem))
                {
                    flag=true;
                    break;
                }
                dcp[tem] = numt%10;
                if(numt!=0)
                    numt = numt/10;
            }
            if(flag)
            {
                flag=false;
                num++;
                continue;
            }
            printf("%d %d %d\n",num,num*2,num*3);
        }
        num++;
    }
    return 0;
}

总结:

  • 审题不够认真仔细
  • 狂妄自大,认为简单题就可以松懈
记录于此,警示于己,愿重新开启新的征程!
编辑于2023-07-11 23:21:44

更新2023-07-13 19:46:18
好吧,还是忍不住翻了下题解,确实有更短的()
不过他是把判断叠起来了,也,也算是短吧
以下代码来自洛谷用户@WilliamEdward

#include <stdio.h>
int main()
{
    int a,b,c;
    for(a=123;a<=333;a++)
            {
                b=a*2;
                c=a*3;
                if((a/100+a/10%10+a%10+b/100+b/10%10+b%10+c/100+c/10%10+c%10==1+2+3+4+5+6+7+8+9)&&((a/100)*(a/10%10)*(a%10)*(b/100)*(b/10%10)*(b%10)*(c/100)*(c/10%10)*(c%10)==(1)*(2)*(3)*(4)*(5)*(6)*(7)*(8)*(9)))
                    printf("%d %d %d\n",a,b,c);
            }
    return 0;
}
0

评论 (0)

取消