51nod1042(0-x出现次数&分治)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1042
题意:中文题诶~
思路:这道题和前面的51nod1009好像,直接套用那个算法也是能ac的,不过我还是喜欢换个口味;
求a, b之间个数字出现的次数。可以由分治的思想,先求出他们在0~b出现的次数, 再求出在0~a-1出现的次数,前者减去后者即为答案;
然而如何求出0~x各个数字出现的次数我是看了一本书上的方法才会的,这里直接给出代码好了,随便带入一组数据也不难验证其正确性,所以也就不多说啦。。。
代码:
#include <bits/stdc++.h>
#define ll long long
#define MAXN 10
using namespace std; ll value=; //***value记录当前的权值
ll vis[MAXN]; //***vis[i]存储0到x中i出现的次数 void deal(ll n){
if(n<=){
return;
}
ll one=n%; //***one, ten分别表示当前n的个位和高位
n/=;
ll ten=n;
for(int i=; i<=one; i++){ //***累计当前个位出现的次数
vis[i]+=value;
}
while(ten){
vis[ten%]+=(one+)*value; //***累计当前高位出现的次数
ten/=;
}
for(int i=; i<; i++){ //***累计权值范围数出现的次数
vis[i]+=n*value; //***注意这里会累加到0开头的情况
}
vis[]-=value; //***将第一位是0的情况排除
value*=;
deal(n-);
} int main(void){
ll a, b;
cin >> a >> b;
if(a>b){
swap(a, b);
}
deal(b);
value=-;
deal(a-);
for(int i=; i<; i++){
cout << vis[i] << endl;
}
return ;
}
还是写一下套用1009ac的代码好了~
代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std; ll deal(ll n, ll key){
ll x=n, cnt=, ans=;
while(n){
if(!key){
ans-=cnt;
}
ll gg=n%;
ll num=x/(cnt*);
if(gg<key){
ans+=num*cnt;
}else if(gg==key){
ans+=num*cnt+x%cnt+;
}else{
ans+=(num+)*cnt;
}
cnt*=;
n/=;
}
return ans;
} int main(void){
ll a, b;
cin >> a >> b;
if(a>b){
swap(a, b);
}
for(ll i=; i<; i++){
cout << deal(b, i)-deal(a-, i) << endl;
}
return ;
}
51nod1042(0-x出现次数&分治)的更多相关文章
- js 返回一个数组里面0出现的次数
var num = new Array(10000).fill('').map((item,index) => (index + 1)). 在点号后面补充代码,让num是这个数组中0出现的次数, ...
- [LeetCode]1342. 将数字变成 0 的操作次数
给你一个非负整数 num ,请你返回将它变成 0 所需要的步数. 如果当前数字是偶数,你需要把它除以 2 :否则,减去 1 . 示例 1: 输入:num = 14 输出:6 解释: 步骤 1) 14 ...
- 基于Qt5.5.0的sql数据库、SDK_tts文本语音朗读的CET四六级单词背诵系统软件的编写V1.0
作者:小波 QQ:463431476 请关注我的博客园:http://www.cnblogs.com/xiaobo-Linux/ 我的第二款软件:CET四六级单词背诵软件.基于QT5.5.0.sql数 ...
- POJ 3286 How many 0's?(几多0?)
POJ 3286 How many 0's?(几多0?) Time Limit: 1000MS Memory Limit: 65536K [Description] [题目描述] A Benedi ...
- P163、面试题29:数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 思 ...
- jquery.rotate.js实现可选抽奖次数和中奖内容的转盘抽奖代码
需求: 抽奖代码最多可以抽奖5次,而且,每次只会中“2000元理财金”或者“谢谢参与”,其它的不会抽中(哈哈,果然都是套路). 效果如下: 一.页面结构: ? 1 2 3 4 5 6 7 8 9 10 ...
- ElasticSearch6.5.0 【Java客户端之REST Client】
说明 High Level Client 是基于 Low Level Client 的.官方文档如下: * https://www.elastic.co/guide/en/elasticsearch/ ...
- Unity3D-RayMarch-几何图元0
效果图: 将下面的shader代码对应的Material拖给一个面片,即可看到效果. shader代码: // Upgrade NOTE: replaced '_Object2World' with ...
- 使用python找出nginx访问日志中访问次数最多的10个ip排序生成网页
使用python找出nginx访问日志中访问次数最多的10个ip排序生成网页 方法1:linux下使用awk命令 # cat access1.log | awk '{print $1" &q ...
随机推荐
- [转载]C++Assert()函数
assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义: #include <assert.h> void assert( i ...
- Linux下重命名文件或文件夹(mv命令与rename命令)
在Linux下重命名文件或目录,可以使用mv命令或rename命令 mv ———————————— mv命令既可以重命名,又可以移动文件或文件夹. 例子:将目录A重命名为B mv A B 例子:将/a ...
- Idea_学习_06_IntelliJ IDEA 自动导入包 快捷方式 关闭重复代码提示
二.参考资料 1.IntelliJ IDEA 自动导入包 快捷方式 关闭重复代码提示
- PHP把时间转换成几分钟前、几小时前、几天前的几个函数、类分享
这篇文章主要介绍了php计算时间几分钟前.几小时前.几天前的几个函数.类分享,需要的朋友可以参考下一.函数实现实例1: <?php header("Content-type: text ...
- 关于MFC主菜单和右键弹出菜单
一.主菜单.弹出菜单和右键菜单的概念: 主菜单是窗口顶部的菜单,一个窗口或对话框只能有一个主菜单,但是主菜单可以被更改(SetMenu()更改): 创建方式:CMenu::CreateMenu(voi ...
- 2.4 AppDelegate 的 3 个生命周期
Classed/AppDelegate.cpp 文件内容如下: #include "cocos2d.h" #include "CCEGLView.h" #inc ...
- Agc018_B Sports Festival
传送门 题目大意 有$n$个人,$m$种运动$(n,m\leq 300)$,每个人对$m$种运动有喜爱度的排名. 请你划分一个$m$种运动的非空集合,使得当每个人参加集合内喜爱度排名最高的运动时,最多 ...
- Java基础 之 System.getProperty()方法
Java基础 之 System.getProperty()方法大全 public static void main(String[] args) { System.out.println(" ...
- 洛谷P2895 [USACO08FEB]流星雨Meteor Shower
题目描述 Bessie hears that an extraordinary meteor shower is coming; reports say that these meteors will ...
- 【LeetCode】020. Valid Parentheses
Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...