acm-HD-11版

本文介绍了杭电HD11版的ACM题目,重点讨论了2089题的解题思路,从最初的超时解决方案到优化后的高效算法。文章通过分析异或运算、使用set容器以及计算非不吉利数个数的方法,揭示了如何避免重复遍历,降低复杂度。最终提供了一个通过所有测试的AC代码。
摘要由CSDN通过智能技术生成

从2089到2099:http://acm.hdu.edu.cn/listproblem.php?vol=11

主要看一下2089,

其他几个技巧如下:

异或运算,^,  满足交换律!   2095

set 容器           2094

算菜价       2090             特殊输出:注意因为oj的机制  在编译器过不了,但是oj可以过,



2089 我怎么写都不对,

开始的思路是  读取m,n  m,n 之间挨个判断 ,去掉所有不吉利数,可是如果m接近 1000000,一定会超时,因为 复杂度接近 n 方 l*g n,

第二种思路是 建立一个容器,装入所有不吉利数,每次读入 m,n就建立一个新 临时容器,m到 n 都放在临时容器里,  容器元素个数差就是 答案,比算法1减少了许多重复的东西。  可是 还是等于 有重复便利 ,最后 空间复杂度过高,代码如下:

#include <iostream>

#include <set>

using namespace std;

int ma=1000000;

set<int> bujili;


int panduan4(int i)

{ int ans=1;

    while (i ) {

        if (i%10==4) {

            ans=0;

            break;

        }

        i=i/10;

    }

    return ans;

}


int panduan62(int i)

{

    int ans=1;

    while (i>10) {

        if (i%100==62 ) {

            ans=0;

            break;

        }

        i=i/10;

    }

    return ans;


    

}


int main()

{

    

        

    int i,j;

    for (i=0; i<ma; i++) {

        

        if (panduan4(i)==0||panduan62(i)==0 ) {

            bujili.insert(i);

        }

    }

    

    int m,n;

    int rq1=bujili.size();

    

    while (cin>>m>>n &&(n!=0||m!=0)) {

        set<int> zanshi;

        zanshi=bujili;

        int qujian=n-m+1;

        for (j=m ; j<n +1; j++) {

            zanshi.insert(j);

        }

        int rq2=zanshi.size();

        

        cout<<rq2-rq1<<endl;    

}

    return 0;

}



 看了别人的文章有所启示,建立一个数组,a[1000000],数组值     =     (下标-0)的区间   内对应非不吉利数 个数,答案直接 数组值相减即可;  AC代码:

#include <stdio.h>
#include <string.h>
int  flag[1000010];
 
void  preprocess()
{
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值