【用膝盖写代码系列】(5):NOIP2013普及组复赛详解

本文解析了洛谷平台上的三道编程题,包括计数问题、表达式求值及小朋友的数字,提供了详细的思路和代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有人问我为什么2013在2014之后?
那是因为。。。。。。你丑(这句划掉)
2013年难啊!

……


第一题:计数问题

题面简述:试计算在区间 1 到 n 的所有整数中,数字 x(0 ≤ x ≤ 9)共出现了多少次?

陷阱提示:这道题和之前的数字统计有异曲同工之妙~

数据范围:对于 100%的数据, 1n1,000,000 0x9

思路描述:这道题需要换一点做法。不断地对数i取余10,直到该数小于10为止。这样可以去除i的每一位。

我的代码:

#include <cstdio>

int main(){
    int i,j,n,m,x;
    int l,r,count=0;
    scanf("%d%d",&n,&x);
    long num = 0;
    for(i=1;i<=n;i++){
        j = i;
        while(j>0){
            if(j%10==x) num++;
            j/=10;
        }
    }
    printf("%d",num);
}

洛谷原题:http://www.luogu.org/problem/show?pid=1980

第一题完。


第二题:表达式求值

题意简述:给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。

陷阱提示:注意 优先级!

数据范围:0≤表达式中加法运算符和乘法运算符的总数≤100000。

思路描述:这里讲究的是输入。这里要一边输入一遍判断。如果当前输入的是符号,那么开始计算即可。

我的代码:

/*
作者:xiaoyao24256
题目:p3292 表达式求值
*/
#include <iostream>
#include <cstdio>
using namespace std;

int main(){
    long long int a,sum=0,tot = 0;
    int i,j,k,n,m;
    char c;
    scanf("%lld",&sum);
    sum%=10000;
            while(scanf("%c",&c)!=EOF&&(c=='*'||c=='+'))
    {
        scanf("%lld",&a);
        a%=10000;
    //  cout<<"a= "<<a<<endl;
        if(c == '*'){
            sum=(sum*a)%10000;
        }
    //  cout<<"sum="<<sum<<"   tot="<<tot<<"  a="<<a<<endl; 
        if(c=='+'){

            tot=(tot+sum)%10000;
        sum=a;
        }


    }
    tot+=sum;
    tot%=10000;
    cout<<tot;
}

洛谷原题:http://www.luogu.org/problem/show?pid=1981

第二题完。


第三题:小朋友的数字

题意简述:给定一个长n的数列,每个数字有一个特征值,为它之前的最大字段和,每个数字有一个分数,为它前面数字的特征值加上它本身的特征值。求出这个数列中最大的一个分数。

陷阱提示:这里不能忽略负数。

数据范围:
1n1,000,000 1p109 ,其他数字的绝对值均不超过 109

思路描述:这道题其实也十分简单。用最大字段和求一下特征值,然后设数1的分数为它本身,就可以完美解决这一道题目。这道题的答案有可能在两个地方:第一个数字和最后一个数字。如果在后面的序列中有任何一个数比第一个数大,就输出最后一个数,否则输出第一个数(的分数)

我的代码:

#include<iostream>
#include<cstdio>

#define MAXN 1000001
using namespace std;
bool flag;
long long n,m,f[MAXN],a[MAXN],tot,g[MAXN],w[MAXN];
int main()

{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    f[1]=a[1];
    long long maxx=a[1];
    w[1]=a[1];
    for(int i=2;i<=n;i++)
    {
        f[i]=max(f[i-1]+a[i],a[i]);
        w[i]=max(w[i-1],f[i]);

    }

    g[1]=w[1];
    g[2]=w[1]+g[1];
    if(g[2]>=g[1])
        flag=1;
    for(int i=3;i<=n;i++){
        if(w[i-1]>0){
            g[i]=(w[i-1]+g[i-1])%m;
            if(g[i]>g[1]) flag=1;
        }
        else g[i]=g[2];
    }
    if(flag)
        printf("%d",g[n]);
    else 
        printf("%d",g[1]%m);

    return 0;

}

洛谷原题:http://www.luogu.org/problem/show?pid=1982

第三题,猝。


抱歉,第四题我实在无能为力。
对不起。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值