试题 A: 平方和
【问题描述】 :
小明对数位中含有 2、0、1、9 的数字很感兴趣,在 1 到 40 中这样的数包 括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574,平方和是 14362。 注意,平方和是指将每个数分别平方后求和。
请问,在 1 到 2019 中,所有这样的数的平方和是多少?
#include"stdio.h"
int fun(long long value)
{
long long x=0;
x=value;
while(x!=0)
{ int stemp;
stemp =x%10;
x=x/10;
if(stemp==2||stemp==0||stemp==1||stemp==9)
{
return value*value;
}
}
return 0 ;
}
int main()
{
int i;
long long sum=0;
for (i=1;i<=2019;i++)
{
if (fun(i))
{
sum=sum+fun(i);
}
}
printf("%lld",sum);
return 0;
}
答案:2658417853
试题 B: 数列求值
【问题描述】
给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和。求 第 20190324 项的最后 4 位数字。
只要求最后四位数字的问题,相当于求答案对10000取模
#include"stdio.h"
int main()
{
long long int i;
int a=1,b=1,c=1,d=3;
for (i=5;i<=20190324;i++)//从第5项开始平均,滑动。
{
a=b;
b=c;
c=d;
d=a+b+c;
if(d>=10000)
{
d=d%10000;//取最后四位
}
}
printf("%lld ",d);
return 0;
}
答案:4659
试题 C: 最大降雨量
【问题描述】
由于沙之国长年干旱,法师小明准备施展自己的一个神秘法术来求雨。 这个法术需要用到他手中的 49 张法术符,上面分别写着 1 至 49 这 49 个 数字。法术一共持续 7 周,每天小明都要使用一张法术符,法术符不能重复使 用。
每周,小明施展法术产生的能量为这周 7 张法术符上数字的中位数。法术 施展完 7 周后,求雨将获得成功,降雨量为 7 周能量的中位数。
由于干旱太久,小明希望这次求雨的降雨量尽可能大,请大最大值是多少?
采用广度优先搜索,先测试数据较少:
//https://www.cnblogs.com/yuanhang110/p/10588575.html
#include<iostream>
#include<string>
#include<queue>
using namespace std;
string ss[35];//储存地图的字符串
int maze[35][55];//地图35行,55列
int dir[4][2]={{1,0},{0,-1},{0,1},{-1,0}};// 向下,向左,向右,向上。
char letter[4]={'D','L','R','U'} ;//向下,向左,向右,向上
int cnt =10000;//记录走出迷宫所需要的步数,初值设为10000
bool vis[35][55];
struct node
{
int x;
int y;
string s;//储存路径字符串
int step;//储存到达5步数
node (int xx,int yy,string ss,int st)//构造函数
{
x=xx;
y=yy;
s=ss;
step=st;
}
};
bool in (int x,int y) //是否越界
{
if(x<4&&x>=0&&y<6&&y>=0) //4行,6列
{
return true;
}
return false;
}
void bfs(int x,int y,string s,int step)
{
queue<node> q;//创建队列 q
q.push(node(x,y,s,step));//初始坐标入队,赋给当前节点
while(!q.empty())//队列为空时,尝试了所有的结果
{
node now =q.front() ;//更新当前节点的值
q.pop(); //将头节点出队
vis[now.x][now.y]=true;//true 代表已经访问过
if(now.x==3&&now.y==5)//到达出口
{
if(now.step<cnt )
{
cnt =now.step;//记录最短步数
cout<<now.step<<":"<<now.s<<endl;//输出步数,路径。
}
continue;//进行下一次while循环,理论上可以break.这是为了保险探索了所有可能情况
}
for (int i=0;i<4;i++) //下左右上四个方向进行探索
{
int tx=now.x+dir[i][0];//x坐标计算
int ty=now.y+dir[i][1];//y坐标计算
if(maze[tx][ty]!=1&&!vis[tx][ty]&&in(tx,ty))//如果坐标在边界内,有路,未曾访问过
{
q.push(node(tx,ty,now.s+letter[i],now.step+1));//将这个坐标入队列 ,记录路径,和步数。
}
}
}
}
int main()
{
for (int i=0;i<4;i++)
{
cin>>ss[i];
}
for(int i=0;i<4;i++)
{
for(int j=0;j<6;j++)
{
maze[i][j]=(ss[i][j]-'0');
}
}
int step=0;
string s=" ";
bfs(0,0,s,step);
return 0;
}
//https://www.cnblogs.com/yuanhang110/p/10588575.html
#include<iostream>
#include<string>
#include<queue>
using namespace std;
string ss[35];//储存地图的字符串
int maze[35][55];//地图35行,55列
int dir[4][2]={{1,0},{0,-1},{0,1},{-1,0}};// 向下,向左,向右,向上。
char letter[4]={'D','L','R','U'} ;//向下,向左,向右,向上
int cnt =10000;//记录走出迷宫所需要的步数,初值设为10000
bool vis[35][55];
struct node
{
int x;
int y;
string s;//储存路径字符串
int step;//储存到达5步数
node (int xx,int yy,string ss,int st)//构造函数
{
x=xx;
y=yy;
s=ss;
step=st;
}
};
bool in (int x,int y) //是否越界
{
if(x<30&&x>=0&&y<50&&y>=0) //30行,50列
{
return true;
}
return false;
}
void bfs(int x,int y,string s,int step)
{
queue<node> q;//创建队列 q
q.push(node(x,y,s,step));//初始坐标入队,赋给当前节点
while(!q.empty())//队列为空时,尝试了所有的结果
{
node now =q.front() ;//更新当前节点的值
q.pop(); //将头节点出队
vis[now.x][now.y]=true;//true 代表已经访问过
if(now.x==29&&now.y==49)//到达出口
{
if(now.step<cnt )
{
cnt =now.step;//记录最短步数
cout<<now.step<<":"<<now.s<<endl;//输出步数,路径。
}
continue;//进行下一次while循环,理论上可以break.这是为了保险探索了所有可能情况
}
for (int i=0;i<4;i++) //下左右上四个方向进行探索
{
int tx=now.x+dir[i][0];//x坐标计算
int ty=now.y+dir[i][1];//y坐标计算
if(maze[tx][ty]!=1&&!vis[tx][ty]&&in(tx,ty))//如果坐标在边界内,有路,未曾访问过
{
q.push(node(tx,ty,now.s+letter[i],now.step+1));//将这个坐标入队列 ,记录路径,和步数。
}
}
}
}
int main()
{
for (int i=0;i<30;i++)
{
cin>>ss[i]; //30行
}
for(int i=0;i<30;i++)
{
for(int j=0;j<50;j++)
{
maze[i][j]=(ss[i][j]-'0');
}
}
int step=0;
string s=" ";
bfs(0,0,s,step);
return 0;
}
完全二叉树 :每一层,子节点是父节点的二倍。不用用数的数据结构也可以求出来。
#include"iostream"
#include"algorithm"
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f;
int main()
{
int n;//个数
cin>>n;
long long min=-INF,ans=0;
int i=0,length=1,depth=1;
for(i=0;i<n;)
{
long long sum=0;
for (int j=0;j<length&&i<n;j++,i++)//逐行求和
{
int x;
cin>>x;
sum+=x;
}
if(sum>min)
{
min=sum;
ans=depth;
}
depth++;
length*=2;
}
cout<<ans<<endl;
}
用店家标识,代表“店家优先级数组”的下标。
#include<iostream>
#include"algorithm"//sort需要
#include"string.h"//memset 需要
#define maxn 100000
using namespace std;
int b[maxn]={0}; //b存放每个店的优先级。
int book[maxn]={0};//标记外卖店是否在优先缓存中。
int book2[maxn]={0};//判断某个时刻i,外卖店是否有订单,如果有订单则标记1,没有则标记为0
struct waimai
{
int ts; //时刻
int id; //店标识
}a[maxn];
bool cmp(waimai a,waimai b) //sort排序所需要的 cmp,是函数名可以任意起
{
return a.ts<b.ts; //按时刻从到大排序,从大到小改为大于号
}
int main()
{
int n,m,t;
int count=0;
scanf("%d%d%d",&n,&m,&t); //输入,店家数,订单数,时刻
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a[i].ts,&a[i].id);
}
sort(a+1,a+m+1,cmp); //所有订单按时刻从小到大排序
// for(int i=1;i<=m;i++)
// {
// printf("%d %d\n",a[i].ts,a[i].id);
// }
for (int i=1;i<=t;i++)//i是时刻的索引值,这个for循环求时刻i时,各个店家的优先级。
{ count = 0;
int x;
for(int j=1;j<=m;j++)//时刻i,有订单的店家更新优先级,并且对其进行标记。
{
if(i==a[j].ts) //是i时刻的订单
{
x=a[j].id; //取出是家店x的订单
b[x]+=2; //这家店x有一个订单,店x的优先级加2
book2[x]=1; // 标记i时刻店家x有订单
}
}
for(int l=1;l<=n;l++)//对于所有的店家,如果时刻i没有订单,则优先级减1,或者保持零
{
if(book2[l]==0) //店家l没有订单
{
if(b[l]>0)
b[l]--;//店家l的优先级减去一
else
b[l]=0;
}
}
for(int l=1;l<=n;l++) //计算i时刻优先级大于5的店家数量
{
if(b[l]>5)//i时刻,店家l优先级大于5
{
book[l]=1;//店家l,标记在优先内存中
count++;
}
}
memset(book2,0,sizeof(book2));//将所有清零为,即认为全部没有订单。
}
printf("%d\n",count);
return 0;
}
测试数据1
#include"iostream"
using namespace std;
#define N 1000005
int mark[N]={0};//数是否出现,的标记数组。
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int m;
cin>>m;
while(mark[m]==1)//数已经出现
m++;//数加一
mark[m]=1;//跳出循环后已经不会重复
cout<<m;
}
return 0;
}