河南工程学院第五届ACM大学生程序设计竞赛(部分题解)

河南工程学院第五届ACM大学生程序设计竞赛(部分题解)

问题 A: 敏感的小明同学

小明是一个对数字非常敏感的人,当他看到某个特定的数字p (1<=p<=9)时就会兴奋一下,现在给你一个数值区间( l , r ),问你当小明看到这个区间内所有的数字时会兴奋多少下?(例如 l=2,r=22,p=2时,小明会兴奋6下,l=2,12,20,21时各兴奋一下,22兴奋两下)

这道题可以化解为求某个区间中某个数字的个数
举个例子:

12105这个数字,千位上是2,那么千位上出现1的整数有多少个呢?10001999,1100011999,总共是2x1000;(2 = 万位+1)

百位上是1,那么百位上出现1的整数有多少个呢?100-199,1100-1199…9100-9199,10100-10199,…11100-11199,12100-12105,总共是12x100+5+1;

十位上是0,那么十位上出现1的整数有多少个呢?10-19,110-119,210-219…1010-1019…10010-10019…12010-12019…总共:121x10

按照低位、当前位、高位来区分

求【1,N】中1出现的个数规律如下:

如果当前位小于1,那么个数等于高位*当前位率

如果当前位等于1,那么个数等于高位*当前位率 + 低位 + 1
如果当前位大于1,那么个数等于(高位+1)*当前位率

参考网站举个例子:

12105这个数字,千位上是2,那么千位上出现1的整数有多少个呢?10001999,1100011999,总共是2x1000;(2 = 万位+1)

百位上是1,那么百位上出现1的整数有多少个呢?100199,11001199…91009199,1010010199,…1110011199,1210012105,总共是12x100+5+1;

十位上是0,那么十位上出现1的整数有多少个呢?1019,110119,210219…10101019…1001010019…1201012019…总共:121x10

按照低位、当前位、高位来区分

求【1,N】中1出现的个数规律如下:

如果当前位小于1,那么个数等于高位*当前位率

如果当前位等于1,那么个数等于高位*当前位率 + 低位 + 1
如果当前位大于1,那么个数等于(高位+1)*当前位率

参考网站:http://www.voidcn.com/article/p-gswrfywk-qs.html

参考代码

#include
using namespace std;
int l,r,p;
int f(int x)
{
    int a=x,t=1,s=0;
    while(x)
    {
        s+=x/10*t;
        if(x%10>p)
        s+=t;
        else if(x%10==p)
        s+=(a%t)+1;//cout<<"1="<

参考网站:https://blog.csdn.net/henuboy/article/details/11287183?utm_source=blogxgwz1&utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242

问题 D: 基建手游

森林探险后小明打算在家中宅一阵子,他迷上了一款基建手游。
在浩瀚的布鲁克西大陆上,有一个神秘的王国,城主小明可以选择在这个王国里圈出一块占地K*K的正方形作为自己的城池,小明希望你选出一块合适的位置,使得他的城池土地价值和最大。

本道题考的知识点为前缀和。

其前缀和的知识点如下:

参考网站:https://blog.csdn.net/K_R_forever/article/details/81775899?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-2.control

在理解前缀和的代码后,我们不难写出代码

#include
#include
#include
#include  //容器
#include    //string
#include  //数学函数
#include       //栈
#include     //优先队列
#include  //字符串转整形
#include //使用istringstrem ( 识别string中的字符串,且不会读取空格)
#include     //set 函数,容器里的元素不能重复
using namespace std;
int a[1000][1000],b[1000][1000];
int main()
{
    int n,m,k;
    cin>>n>>m>>k;
    for(int i=0;i>b[i][j];
            a[i][j]=b[i][j]+a[i][j-1]+a[i-1][j]-a[i-1][j-1];
        }
    int max=-999999;
    int x,y;
    k--;
    for(int i=0;imax)
            {
                x=i+1;
                y=j+1;
                max=sum;
            }
        }
        cout<

以上是本次比赛的部分代码,有不对之处,请大家多多交流指正。

你可能感兴趣的:(c++)