一、等凸函数
问题描述:
定义一种数字称为等凹数字,即从高位到低位,每一位的数字先递减再递增,且该数是一个回文数,即从左读到右与从右读到左是一样的,仅形成一个等凹峰,如543212345,5544334455是合法的等凹数字,543212346,123321不是等凹数字。现在问你[L,R]中有多少等凹数字呢?L,R<=1e18(小于等于2位的无凹峰)输入:
第一行一个整数T,表示有T组数据,T <= 110.
接下来的每行包含两个用空格分开的整数L R,保证L,R<=1e18.
(如:输入“2 \n 1 100 \n 666 666666”)
输出:
对于每组输入,在一行输出一个整数,代表[L,R]中等凹数字的个数。
(“0 \n 356”)
源代码:
#include<iostream>
#include<cstring>
#include<sstream>
#include<cstdio>
using namespace std;
typedef long long ll;
int num(ll x) {
int n=0;
while(x) {
n++;
x/=10;
}
return n;
}
ll sum=0;
int a[20];
void dfs(int n,ll l,ll r,int p,int fa) {
if(n==0) {
int i=0;
while(a[i]==-1)i++;
int j=18;
while(a[j]==-1)j--;
ll su=0;
int x=0;
for(int k=j; k>=i; k--) {
if(a[k]==a[j])x++;
su=su*10+a[k];
}
if(x==j-i+1)return;
if(su>=l&&su<=r) {
sum++;
}
return;
}
for(int i=fa; i>=0; i--) {
if(p) {
a[9+n-1]=i;
a[9-n+1]=i;
dfs(n-1,l,r,p,i);
a[9+n-1]=-1;
a[9-n+1]=-1;
} else {
a[9+n]=i;
a[9+1-n]=i;
dfs(n-1,l,r,p,i);
a[9+n]=-1;
a[9+1-n]=-1;
}
}
}
void dfs_(int n,ll l,ll r) {
if(n<=2)return;
dfs((n+1)/2,l,r,n%2?1:0,9);
}
int main() {
int T;
cin>>T;
while(T--) {
sum=0;
memset(a,-1,sizeof(a));
ll l,r;
cin>>l>>r;
int s=num(l);
int e=num(r);
for(int i=s; i<=e; i++) {
dfs_(i,l,r);
}
cout<<sum<<endl;
}
return 0;
}
二、两只老虎
问题描述;Tmk觉得很奇怪,因为在他面前突然出现了一群这样的老虎,有的没耳朵,有的没尾巴,不过也有正常的。
现在Tmk告诉你这群老虎的耳朵个数,尾巴条数,以及老虎的腿的数目,问你有多少只是正常的。
其中只有三种老虎:
第一种(正常的)