小明是一个对数字非常敏感的人,当他看到某个特定的数字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="<>n;
while(n--)
{
cin>>l>>r>>p;
cout<
小明是个方向感极弱的人,为了证明自己,他打算进入森林探险。
他的朋友小红给了他一个写满坐标的地图,如果他按照地图上的点一通过并且最终记住自己向左转动(不包括向后转动)了几次的话,就算小明胜利。
望着地图上密密麻麻的坐标轴,小明头都大了,但是聪明的他立刻想到了你:算法神犇!
你可以帮助他完成这一挑战吗?
问题分析:
这道题可以以平面方程系列中的问题,可以采用点积,叉积的思想解决问题。
向量积,数学中又称外积、叉积,物理中称矢积、叉乘,是一种在向量空间中向量的二元运算。与点积不同,它的运算结果是一个向量而不是一个标量。并且两个向量的叉积与这两个向量和垂直。
计算是这样的,对于向量a(x1,y1),b(x2,y2)
他们的叉积a×b=x1y2-y1x2
叉积是一个向量,表示的是有向面积,方向可以用右手定则来判断,比如要用a×b,就要把a旋转到b,如果四指为旋转方向,拇指所指的方向就是叉积的方向
参考链接:
https://blog.csdn.net/ld326/article/details/84689620?utm_source=app&app_version=4.9.1&code=app_1562916241&uLinkId=usr1mkqgl919blen
下面上代码:
#include
#include
#include
#include //容器
#include //string
#include //数学函数
#include //栈
#include //优先队列
#include //字符串转整形
#include //使用istringstrem ( 识别string中的字符串,且不会读取空格)
#include //set 函数,容器里的元素不能重复
using namespace std;
struct p
{
int x;
int y;
}y[2000];
double panduan(p p1,p p2,p p3)
{
return ((p2.x-p1.x)*(p3.y-p2.y)-(p3.x-p2.x)*(p2.y-p1.y));
}
int main()
{
int n;
struct p y[2000];
cin>>n;
for(int i=0;i>y[i].x>>y[i].y;
}
int ans=0;
for(int i=2;i0)
ans++;
}
cout<
小明是个强迫症患者,每次必须喝固定容量的水,但是森林探险条件简陋,他又忘记携帯量筒,现在找到了据说是算法神犇的你,来帮助他。
他有两个杯子A和B,想要喝的水量C,对杯子A和B可以有三种操作:
1、将杯子 i 满水
2、将杯子 i 的水倒
3、将杯子 i 的水倒进杯子 j 中,在这个操作后,有可能杯子 j 是满的(杯子 i 中可能还有一些水),也有可能杯子 i 是空的(他里面的水都被倒进了杯子 j 里)
为了保持森林探险所需要的体力,对杯子的操作要尽可能的少,现在请你帮助小明,补充水分,使他更好地森林探险。