新手村之过程函数与递归

P1028 数的计算

    • 23.5K通过
    • 47.4K提交
  • 题目提供者CCF_NOI
  • 评测方式云端评测
  • 标签NOIp普及组2001(或之前)
  • 难度普及-
  • 时空限制1000ms / 128MB

 提交  题解   

  • 提示:收藏到任务计划后,可在首页查看。

最新讨论显示

推荐的相关题目显示

题目描述

我们要求找出具有下列性质数的个数(包含输入的自然数nn):

先输入一个自然数nn(n \le 1000n≤1000),然后对此自然数按照如下方法进行处理:

  1. 不作任何处理;

  2. 在它的左边加上一个自然数,但该自然数不能超过原数的一半;

  3. 加上数后,继续按此规则进行处理,直到不能再加自然数为止.

输入输出格式

输入格式:

11个自然数nn(n \le 1000n≤1000)

输出格式:

扫描二维码关注公众号,回复: 3541031 查看本文章

11个整数,表示具有该性质数的个数。

输入输出样例

输入样例#1: 复制

6

输出样例#1: 复制

6

说明

满足条件的数为

6,16,26,126,36,136

思路:

这个题的表述感觉很别扭,我也说不太清楚,直接说思路吧

对于一个数延伸出来的数,我们其实是不用加上原来的数再操作的,于是我们可以得出dp方程:

f[ x ] = 1;

for (int j = 1;j <= x / 2;j ++)
            f[x] += f[j];

特别的,f [ 1] = 1;

代码:

#include<bits/stdc++.h>
using namespace std;
int f[1010];
void init()
{
    f[1] = 1;
    for (int i = 2;i <= 1000;i ++)
    {
        f[i] = 1;
        for (int j = 1;j <= i / 2;j ++)
            f[i] += f[j];
    }
}
int main()
{
    init();
    int n;
    scanf("%d",&n);
    printf("%d\n",f[n]);
    return 0;
}

P1149 火柴棒等式

    • 16.6K通过
    • 31.7K提交
  • 题目提供者CCF_NOI
  • 评测方式云端评测
  • 标签NOIp提高组2008
  • 难度普及-
  • 时空限制1000ms / 128MB

 提交  题解   

  • 提示:收藏到任务计划后,可在首页查看。

最新讨论显示

推荐的相关题目显示

题目描述

给你n根火柴棍,你可以拼出多少个形如“A+B=CA+B=C”的等式?等式中的AA、BB、CC是用火柴棍拼出的整数(若该数非零,则最高位不能是00)。用火柴棍拼数字0-90−9的拼法如图所示:

注意:

  1. 加号与等号各自需要两根火柴棍

  2. 如果A≠BA≠B,则A+B=CA+B=C与B+A=CB+A=C视为不同的等式(A,B,C>=0A,B,C>=0)

  3. nn根火柴棍必须全部用上

输入输出格式

输入格式:

一个整数n(n<=24)n(n<=24)。

输出格式:

一个整数,能拼成的不同等式的数目。

输入输出样例

输入样例#1: 复制

14

输出样例#1: 复制

2

输入样例#2: 复制

18

输出样例#2: 复制

9

说明

【输入输出样例1解释】

22个等式为0+1=10+1=1和1+0=11+0=1。

【输入输出样例2解释】

99个等式为:

0+4=4
0+11=11
1+10=11
2+2=4
2+7=9
4+0=4
7+2=9
10+1=11
11+0=11

思路:

蒟蒻表示........暴力嘛(嘻嘻嘻)

代码:

#include<bits/stdc++.h>
using namespace std;
int num[10] = {6,2,5,5,4,5,6,3,7,6};
int solve(int x)
{
    int res = 0;
    if (!x)
        res = 6;
    while (x)
    {
        res += num[x % 10];
        x /= 10;
    }
    return res;
}
int main()
{
    int n;
    scanf("%d",&n);
    n -= 4;
    int ans = 0;
    for (int i = 0;i <= 1000;i ++)
    {
        for (int j = 0;j <= 1000;j ++)
        {
            int t = i + j;
            if (solve(t) + solve(i) + solve(j) == n)
                ans ++;
        }
    }
    printf("%d\n",ans);
    return 0;
}

P1036 选数

    • 17.8K通过
    • 40.3K提交
  • 题目提供者CCF_NOI
  • 评测方式云端评测
  • 标签NOIp普及组2002
  • 难度普及-
  • 时空限制1000ms / 128MB

 提交  题解   

  • 提示:收藏到任务计划后,可在首页查看。

最新讨论显示

推荐的相关题目显示

题目描述

已知 nn 个整数 x_1,x_2,…,x_nx1​,x2​,…,xn​,以及11个整数kk(k<nk<n)。从nn个整数中任选kk个整数相加,可分别得到一系列的和。例如当n=4,k=3n=4,k=3,44个整数分别为3,7,12,193,7,12,19时,可得全部的组合与它们的和为:

3+7+12=223+7+12=22

3+7+19=293+7+19=29

7+12+19=387+12+19=38

3+12+19=343+12+19=34。

现在,要求你计算出和为素数共有多少种。

例如上例,只有一种的和为素数:3+7+19=293+7+19=29。

输入输出格式

输入格式:

键盘输入,格式为:

n,kn,k(1 \le n \le 20,k<n1≤n≤20,k<n)

x_1,x_2,…,x_n (1 \le x_i \le 5000000)x1​,x2​,…,xn​(1≤xi​≤5000000)

输出格式:

屏幕输出,格式为: 11个整数(满足条件的种数)。

输入输出样例

输入样例#1: 复制

4 3
3 7 12 19

输出样例#1: 复制

1

思路:

dfs的01搜索

代码:

#include<bits/stdc++.h>
using namespace std;
int a[30];
int n,k,ans = 0;
bool judge(int x)
{
    for (int i = 2;i <= sqrt(x);i ++)
        if (x % i == 0)
            return 0;
    return 1;
}

void dfs(int sum,int num,int pos)//当前和为sum,num总个数,pos当前位置
{
    if (pos == n + 1 || num == k)
    {
        if (judge(sum) && num == k)
            ans ++;
        return ;
    }
    dfs(sum,num,pos + 1);
    dfs(sum + a[pos],num + 1,pos + 1);//选与不选
}
int main()
{
    scanf("%d %d",&n,&k);
    for (int i = 1;i <= n;i ++)
        scanf("%d",&a[i]);
    dfs(0,0,1);
    printf("%d\n",ans);
    return 0;
}

P1217回文质数

    • 12.3K通过
    • 50.8K提交
  • 题目提供者FarmerJohn2
  • 评测方式云端评测
  • 标签USACO高性能
  • 难度普及-
  • 时空限制1000ms / 128MB

 提交  题解   

  • 提示:收藏到任务计划后,可在首页查看。

最新讨论显示

推荐的相关题目显示

题目描述

因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。

写一个程序来找出范围[a,b](5 <= a < b <= 100,000,000)( 一亿)间的所有回文质数;

输入输出格式

输入格式:

第 1 行: 二个整数 a 和 b .

输出格式:

输出一个回文质数的列表,一行一个。

输入输出样例

输入样例#1: 复制

5 500

输出样例#1: 复制

5
7
11
101
131
151
181
191
313
353
373
383

说明

Hint 1: Generate the palindromes and see if they are prime.

提示 1: 找出所有的回文数再判断它们是不是质数(素数).

Hint 2: Generate palindromes by combining digits properly. You might need more than one of the loops like below.

提示 2: 要产生正确的回文数,你可能需要几个像下面这样的循环。

题目翻译来自NOCOW。

USACO Training Section 1.5

产生长度为5的回文数:

        for (int i = 1;i <= 9;i ++)
            for (int j = 0;j <= 9;j ++)
                for (int k = 0;k <= 9;k ++)
                {
                    int t = i * 10000 + j * 1000 + k * 100 + j * 10 + i;
                    if (t >= a && t <= b && judge(t))
                        printf("%d\n",t);
                }

思路:

首先,偶数位的回文数不是质数(除11外),然后我们打一个1e4的素数的表用来判断是否是素数,这样我们就可以暴力求了

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4;
bool check[maxn + 10];
int prime[1500];
int pos = 0;
void init()
{
    memset(check,0,sizeof(check));
    check[1] = 1;
    for (int i = 2;i <= maxn;i ++)
        if (!check[i])
        {
            prime[pos ++] = i;
            for (int j = i + i;j <= maxn;j += i)
                check[j] = 1;
        }
}
int _count(int x)
{
    int cnt = 0;
    while (x)
    {
        cnt ++;
        x /= 10;
    }
    return cnt;
}
bool judge(int x)
{
    for (int i = 0;i < pos;i ++)
        if (x % prime[i] == 0)
            return 0;
    return 1;
}
int a,b;
void solve(int digit)
{
    if (digit == 1)
    {
        for (int i = a;i <= 9;i ++)
            if (!check[i] && i <= b)
                printf("%d\n",i);
    }
    else if (digit == 2 && 11 >= a && 11 <= b)
        printf("11\n");
    else if (digit == 3)
        for (int i = 1;i <= 9;i ++)
        {
            for (int j = 0;j <= 9;j ++)
            {
                int t = i * 100 + j * 10 + i;
                if (t >= a && t <= b && !check[t])
                    printf("%d\n",t);
            }
        }
    else if (digit == 5)
        for (int i = 1;i <= 9;i ++)
            for (int j = 0;j <= 9;j ++)
                for (int k = 0;k <= 9;k ++)
                {
                    int t = i * 10000 + j * 1000 + k * 100 + j * 10 + i;
                    if (t >= a && t <= b && judge(t))
                        printf("%d\n",t);
                }
    else if (digit == 7)
        for (int i = 1;i <= 9;i ++)
            for (int j = 0;j <= 9;j ++)
                for (int k = 0;k <= 9;k ++)
                    for (int h = 0;h <= 9;h ++)
                    {
                        int t = i*1000000+j*100000+k*10000+h*1000+k*100+j*10+i;
                        if (t <= b && t >=a && judge(t))
                            printf("%d\n",t);
                    }
    else ;
}
int main()
{
    init();
    scanf("%d %d",&a,&b);
    int x = _count(a),y = _count(b);
    x -= x == 9 ? 1 : 0,y -= y == 9 ? 1 : 0;
    for (int i = x;i <= y;i ++)
        solve(i);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/cloudy_happy/article/details/82860678