好数
题目描述
一个整数如果按从低位到高位的顺序,奇数位(个位、百位、万位 · · · )上的数字是奇数,偶数位(十位、千位、十万位 · · · )上的数字是偶数,我们就称之为“好数”。给定一个正整数 N,请计算从 1 到 N 一共有多少个好数。
输入格式
一个整数 N。
输出格式
一个整数代表答案。
样例输入
24
样例输出
7
提示
对于第一个样例,24 以内的好数有 1、3、5、7、9、21、23,一共 7 个。试题 C: 好数 4第十五届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组【评测用例规模与约定】对于 10% 的评测用例,1 ≤ N ≤ 100。对于 100% 的评测用例,1 ≤ N ≤ 10^7。
#include<bits/stdc++.h>
using namespace std;
bool juge(long long x)//寻找好数
{
long long y=x;
long long cnt=0;
while(y)
{
long long a=y%10;
if(cnt%2==0)
{
if(a%2==0)
{
return false;
}
}
if(cnt%2==1)
{
if(a%2==1)
{
return false;
}
}
cnt++;
y/=10;
}
return true;
}
int main()
{
long long n;
cin>>n;
long long cnt=0;
for(long long i=1;i<=n;i++)
{
if(juge(i))
{
cnt++;
// cout<<i<<"\n";
}
}
cout<<cnt;
return 0;
}
R 格式
题目描述
小蓝最近在研究一种浮点数的表示方法:R 格式。对于一个大于 0 的浮点数 d,可以用 R 格式的整数来表示。给定一个转换参数 n,将浮点数转换为 R格式整数的做法是:
1. 将浮点数乘以 2n;
2. 四舍五入到最接近的整数。
输入格式
一行输入一个整数 n 和一个浮点数 d,分别表示转换参数,和待转换的浮点数。
输出格式
输出一行表示答案:d 用 R 格式表示出来的值。
样例输入
2 3.14
样例输出
13
提示
【样例说明】
3.14 × 22 = 12.56,四舍五入后为 13。
【评测用例规模与约定】
对于 50% 的评测用例:1 ≤ n ≤ 10,1 ≤ 将 d 视为字符串时的长度 ≤ 15。
对于 100% 的评测用例:1 ≤ n ≤ 1000,1 ≤ 将 d 视为字符串时的长度≤ 1024;保证 d 是小数,即包含小数点。
在考场上想到这种方法,只能拿到50%的分数。
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long n;
long double d;
cin>>n>>d;
long double t;
long long m=round(pow(2,n)*d);
cout<<m;
return 0;
}
宝石组合
题目描述
在一个神秘的森林里,住着一个小精灵名叫小蓝。有一天,他偶然发现了一个隐藏在树洞里的宝藏,里面装满了闪烁着美丽光芒的宝石。这些宝石都有着不同的颜色和形状,但最引人注目的是它们各自独特的 “闪亮度” 属性。每颗宝石都有一个与生俱来的特殊能力,可以发出不同强度的闪光。小蓝共找到了N 枚宝石,第 i 枚宝石的 “闪亮度” 属性值为 Hi,小蓝将会从这 N 枚宝石中选出三枚进行组合,组合之后的精美程度 S 可以用以下公式来衡量:
其中 LCM 表示的是最小公倍数函数。小蓝想要使得三枚宝石组合后的精美程度 S 尽可能的高,请你帮他找出精美程度最高的方案。如果存在多个方案 S 值相同,优先选择按照 H 值升序排列后字典序最小的方案。
输入格式
第一行包含一个整数 N 表示宝石个数。第二行包含 N 个整数表示 N 个宝石的 “闪亮度”。
输出格式
输出一行包含三个整数表示满足条件的三枚宝石的 “闪亮度”。
样例输入
5 1 2 3 4 9
样例输出
1 2 3
提示
【评测用例规模与约定】
对于 30% 的评测用例:3 ≤ N ≤ 100,1 ≤ Hi ≤ 1000。
对于 60% 的评测用例:3 ≤ N ≤ 2000。
对于 100% 的评测用例:3 ≤ N ≤ 105,1 ≤ Hi ≤ 105。
#include<bits/stdc++.h>
using namespace std;
int a[100005];
vector<int> v[100005];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+1+n);
for(int i=1;i<=n;i++)
{
for(int j=1;j*j<=a[i];j++)//找到数a[i]的因子,这种遍历只能找到一半因子
{
if(a[i]%j==0)
{
v[j].push_back(a[i]);//每次将含有j因子的数存入v[j]中
if(a[i]/j!=j) v[a[i]/j].push_back(a[i]);//由于上述遍历只能找到一半的因子,所以要通过a[i]/j找到另一半因子,然后将含有另一半因子的数存入数组中
}
}
}
for(int i=100000;i>=0;i--)//从含有的因子数中的最大值开始寻找
{
if(v[i].size()>=3)
{
cout<<v[i][0];//先输出第一个是为了方便后面输出的格式真确,(就是为了最后一个元素后面没有空格)
for(int j=1;j<3;j++)
{
cout<<" "<<v[i][j];
}
break;
}
}
return 0;
}
数字接龙
题目描述
小蓝最近迷上了一款名为《数字接龙》的迷宫游戏,游戏在一个大小为N × N 的格子棋盘上展开,其中每一个格子处都有着一个 0 . . . K − 1 之间的整数。游戏规则如下:
1. 从左上角 (0, 0) 处出发,目标是到达右下角 (N − 1, N − 1) 处的格子,每一步可以选择沿着水平/垂直/对角线方向移动到下一个格子。
2. 对于路径经过的棋盘格子,按照经过的格子顺序,上面的数字组成的序列要满足:0, 1, 2, . . . , K − 1, 0, 1, 2, . . . , K − 1, 0, 1, 2 . . . 。
3. 途中需要对棋盘上的每个格子恰好都经过一次(仅一次)。
4. 路径中不可以出现交叉的线路。例如之前有从 (0, 0) 移动到 (1, 1),那么再从 (1, 0) 移动到 (0, 1) 线路就会交叉。
为了方便表示,我们对可以行进的所有八个方向进行了数字编号,如下图2 所示;因此行进路径可以用一个包含 0 . . . 7 之间的数字字符串表示,如下图 1是一个迷宫示例,它所对应的答案就是:41255214。
现在请你帮小蓝规划出一条行进路径并将其输出。如果有多条路径,输出字典序最小的那一个;如果不存在任何一条路径,则输出 −1。
输入格式
第一行包含两个整数 N、K。接下来输入 N 行,每行 N 个整数表示棋盘格子上的数字。
输出格式
输出一行表示答案。如果存在答案输出路径,否则输出 −1。
样例输入
3 3 0 2 0 1 1 1 2 0 2
样例输出
41255214
提示
【样例说明】行进路径如图 1 所示。
【评测用例规模与约定】对于 80% 的评测用例:1 ≤ N ≤ 5。对于 100% 的评测用例:1 ≤ N ≤ 10,1 ≤ K ≤ 10。
#include<iostream>
using namespace std;
int main()
{
cout<<-1;
return 0;
}
爬山
题目描述
小明这天在参加公司团建,团建项目是爬山。在 x 轴上从左到右一共有 n座山,第 i 座山的高度为 hi。他们需要从左到右依次爬过所有的山,需要花费的体力值为 S = Σni=1hi。
然而小明偷偷学了魔法,可以降低一些山的高度。他掌握两种魔法,第一种魔法可以将高度为 H 的山的高度变为 ⌊√H⌋,可以使用 P 次;第二种魔法可以将高度为 H 的山的高度变为 ⌊H/2⌋,可以使用 Q 次。并且对于每座山可以按任意顺序多次释放这两种魔法。
小明想合理规划在哪些山使用魔法,使得爬山花费的体力值最少。请问最优情况下需要花费的体力值是多少?
输入格式
输入共两行。
第一行为三个整数 n,P,Q。
第二行为 n 个整数 h1,h2,. . . ,hn。
输出格式
输出共一行,一个整数代表答案。
样例输入
复制
4 1 1 4 5 6 49
样例输出
18
提示
【样例说明】将第四座山变为 ⌊√49⌋ = 7,然后再将第四座山变为 ⌊7/2⌋ = 3。体力值为 4 + 5 + 6 + 3 = 18。
【评测用例规模与约定】
对于 20% 的评测用例,保证 n ≤ 8,P = 0。
对于 100% 的评测用例,保证 n ≤ 100000,0 ≤ P ≤ n,0 ≤ Q ≤ n,0 ≤ hi ≤ 100000。
//这个题目没用做出来,只做出了25%的样例
#include<bits/stdc++.h>
using namespace std;
int a[100005];
int main()
{
int n,p,q;
cin>>n>>p>>q;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+1+n);
for(int i=1;i<=p;i++)
{
a[n]=sqrt(a[n]);
sort(a+1,a+1+n);
}
for(int j=1;j<=q;j++)
{
a[n]=a[n]/2;
sort(a+1,a+1+n);
}
int sum=0;
for(int i=1;i<=n;i++)
{
sum+=a[i];
}
cout<<sum;
return 0;
}
拔河
题目描述
小明是学校里的一名老师,他带的班级共有 n 名同学,第 i 名同学力量值为 ai。在闲暇之余,小明决定在班级里组织一场拔河比赛。
为了保证比赛的双方实力尽可能相近,需要在这 n 名同学中挑选出两个队伍,队伍内的同学编号连续:{al1, al1+1, ..., ar1−1, ar1} 和 {al2, al2+1, ..., ar2−1, ar2},其中 l1 ≤ r1 < l2 ≤ r2。
两个队伍的人数不必相同,但是需要让队伍内的同学们的力量值之和尽可能相近。请计算出力量值之和差距最小的挑选队伍的方式。
输入格式
输入共两行。
第一行为一个正整数 n。
第二行为 n 个正整数 ai。
输出格式
输出共一行,一个非负整数,表示两个队伍力量值之和的最小差距。
样例输入
5 10 9 8 12 14
样例输出
复制
1
提示
【样例说明】
其中一种最优选择方式:队伍 1:{a1, a2, a3},队伍 2:{a4, a5},力量值和分别为 10 + 9 + 8 = 27,12 + 14 = 26,差距为 |27 − 26| = 1。
【评测用例规模与约定】
对于 20% 的评测用例,保证 n ≤ 50。
对于 100% 的评测用例,保证 n ≤ 103,ai ≤ 109。
#include<bits/stdc++.h>
using namespace std;
long long a[1003];
struct node{//定义结构体,找出所有的和,然后记录和的起始位置和终止位置。
int start;
int end;
long long sum;
}pp[1000006];
bool cmp(node a,node b)//定义如何将结构体中的函数进行排序,首先是将求出所有的和从小到大排序,然后如果和相等,就将起始位置从小到大排序,最后就是终止位置。
{
if(a.sum!=b.sum) return a.sum<b.sum;
else if(a.start!=b.start) return a.start<b.start;
else return a.end<b.end;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)//计算得出前缀和
{
cin>>a[i];
a[i]+=a[i-1];
}
int cnt=0;
for(int i=0;i<=n;i++)//用两层循环计算得到数组中所有连续元素的和值。
{
for(int j=i+1;j<=n;j++)
{
pp[cnt].sum=a[j]-a[i];
pp[cnt].start=i+1;
pp[cnt].end=j;
cnt++;
}
}
// for(int i=0;i<cnt;i++)
// {
// cout<<pp[i].start<<" "<<pp[i].end<<" "<<pp[i].sum<<"\n";
// }
sort(pp,pp+cnt,cmp);//将结构体进行排序
// for(int i=0;i<cnt;i++)
// {
// cout<<pp[i].start<<" "<<pp[i].end<<" "<<pp[i].sum<<"\n";
// }
// cout<<"\n";
long long min1=0x3f3f3f;
long long x;
for(int i=1;i<cnt;i++)//找到最小的和值,但是和值的起始位置和终止位置没有交集
{
if(pp[i].start<=pp[i-1].end)
{
x=abs(pp[i].sum-pp[i-1].sum);
min1=min(min1,x);
}
}
cout<<min1;
return 0;
}