从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()
{