第六届CCPC河南省河南省大学生程序与设计竞赛题解

Pem A. Once In My Life

一.题目展示

对于小 A 而言,数位包含 1 ∼ 9,并且至少两个数位是 d(1 ≤ d ≤ 9)的十. 进. 制. 正. 整. 数. 都是幸运数。
当 d = 3 时,显然 1234567890123 是小 A 的幸运数,但 987654321 因为数位 3 仅出现了一次而不是
幸运数,998244353 因为缺少数位 1, 6, 7 而不是幸运数。
现在小 A 有一个正整数 n,并给出正整数 d。他想找到正整数 k 使得二者的乘积 n · k 是幸运数。你
能用计算机辅助他的计算吗?
输入格式
本. 题. 测. 试. 点. 包. 含. 多. 组. 数. 据。.
第一行,一个正整数 T(1 ≤ T ≤ 3 × 105),表示数据组数。
对于每组数据:
一行,两个正整数 n, d(1 ≤ n ≤ 108,1 ≤ d ≤ 9)。
输出格式
对于每组数据:
输出一行,一个正整数 k,满足 n · k 是幸运数。你需要保证 k ≤ 2 × 1010。
样例
standard input
3
1 6
123456789
233 2
standard output
1234567896
404
9217006
提示
对于 n = 1,d = 6,可以取 k = 1234567896,有 n · k = 1234567896 为幸运数。
对于 n = 12345678,d = 9,可以取 k = 404,有 n · k = 4987653912 为幸运数。
对于 n = 233,d = 2,可以取 k = 9217006,有 n · k = 2147562398 为幸运数。

思路解析

幸运数由123456789+其中一个数构成,重复数为d
即构造1234567890+d+n(把n放最后,使构造数能够整除)
N-=N%n减去多余的数
k=N/n;

代码展示

#include//A
#include
#include
#include
using namespace std;
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
int main()
{
IOS;
int t;cin>>t;
while(t–)
{

	long long int n,d,len,N;
	cin>>n>>d;
	len=( int)log10(n)+1;
	len=pow(10,len);

	N=(1234567890+d)*len+n;

	N-=N%n;

	cout<<N/n<<endl;
}

return 0;

}

Problem B. 扫雷 1

一.题目展示

T0xel 喜欢玩扫雷,但是他玩的扫雷游戏有名为 “地雷探测器” 的特殊道具。
具体来说,T0xel 会进行 n 轮扫雷。每轮扫雷开始之前,T0xel 会获得 1 枚扫雷币。扫雷币在每轮扫
雷结束后不会回收,可以保留至下一轮扫雷。T0xel 知道,在第 i 轮(1 ≤ i ≤ n)扫雷中,花费 ci 枚扫
雷币可以购买一个地雷探测器,清除地图中的一个雷。地雷探测器在一轮扫雷中可以购买任意次。
现在 T0xel 想知道,在这 n 轮扫雷中最多能购买多少个地雷探测器呢?
输入格式
第一行,一个正整数 n(1 ≤ n ≤ 2 × 105),表示扫雷轮数。
第二行,n 个正整数 c1, c2, . . . , cn(1 ≤ ci ≤ 109)。
输出格式
一行,一个非负整数,表示答案。
样例
standard input standard output
6
3 2 5 3 4 3
2
5
6 3 3 4 2
2
5
7 6 5 9 8
0
提示
对于第一个样例,T0xel 可以选择在第 2 轮与第 6 轮扫雷中各购买一个地雷探测器。具体过程如下:
• 获得 1 枚扫雷币,目前有 1 枚扫雷币。第 1 轮扫雷开始,不购买地雷探测器。
• 获得 1 枚扫雷币,目前有 2 枚扫雷币。第 2 轮扫雷开始,购买一个地雷探测器,目前有 0 枚扫雷币。
• 获得 1 枚扫雷币,目前有 1 枚扫雷币。第 3 轮扫雷开始,不购买地雷探测器。
• 获得 1 枚扫雷币,目前有 2 枚扫雷币。第 4 轮扫雷开始,不购买地雷探测器。
• 获得 1 枚扫雷币,目前有 3 枚扫雷币。第 5 轮扫雷开始,不购买地雷探测器。
• 获得 1 枚扫雷币,目前有 4 枚扫雷币。第 6 轮扫雷开始,购买一个地雷探测器,目前有 1 枚扫雷币。
对于第二个样例,T0xel 可以选择在第 5 轮扫雷中购买两个地雷探测器。
对于第三个样例,T0xel 无法在这 5 轮扫雷中购买地雷探测器。

思路解析

用哈希数组存储个数,
将数据排序,花费小的排前面
然后遍历原始数据,当原始数据与排序后的数据相等便可以买,记录买的数量,哈希数组记录的位数减一,不相等,表示这个不能买,也减一。

代码展示

#include//M
#include

using namespace std;
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
const int N=3e5+30;
long long ai[N],bi[N],n;
int er(int k)
{
long long minn=1e9,maxx=0;
for(int i=0;i<n;i++)
{
maxx=max(maxx,ai[i]-kbi[i]);
minn=min(minn,ai[i]+k
bi[i]);
}
if(maxx>minn)return 0;
else return 1;
}
int main()
{
IOS
int t;cin>>t;
while(t–)
{
cin>>n;
for(int i=0;i<n;i++)cin>>ai[i];
for(int j=0;j<n;j++)cin>>bi[j];
long long int l=0,r=1e9,mid=0;
while(l<r)
{
mid=(l+r)/2;
if(er(mid))r=mid;
else l=mid+1;

	}
	cout<<r<<endl;

}

return 0;

}

F - 优秀字符串

一.题目展示

小 A 认为,一个字符串 S 是优秀字符串,当且仅当:
• S 的长度 |S| 恰好为 5;
• S 的第三个字符与第五个字符相同;
• S 的前四个字符互不相同。
例如 henan 是优秀字符串,但 query、problem、queue 不是,因为:
• query 的第三个字符为 e,而第五个字符为 y;
• problem 的长度不为 5;
• queue 的前四个字符中 u 出现了两次。
现在,小 A 有 n 个仅包含英文字母与数字的字符串 S1, S2, . . . , Sn,请你帮小 A 求出这些字符串中
优秀字符串的数量。
输入格式
第一行,一个正整数 n(1 ≤ n ≤ 105),表示字符串的数量。
接下来 n 行,每行一个仅包含英文字母与数字的字符串 Si。保证 ∑|Si
| ≤ 2 × 105。
输出格式
一行,一个整数,表示给定字符串中优秀字符串的数量。
样例
standard input
4
henan
query
problem
queue
standard output
1

代码展示

#include//F
#include
#include

using namespace std;

int main()
{
int n;cin>>n;
string str;
int sum=0;
while(n–)
{
cin>>str;
if(str.size()==5&&str[2]==str[4]&&str[0]!=str[1]&&str[0]!=str[2]&&str[0]!=str[3]&&str[1]!=str[2]&&str[1]!=str[3]&&str[3]!=str[2]){sum++;
}
}
cout<<sum;

return 0;

}

J - 排列与合数

一.题目展示

小 A 在 2023 年河南省 CCPC 大学生程序设计竞赛的赛场上遇到了一道名为 “排列与质数” 的题目。
与大多数选手一样,小 A 并没能在赛场上解决这个棘手的题目。比赛结束后,小 A 想到了一个与之相关
的题目:排列与合数,可是小 A 仍然没有能力解决。这个名为 “排列与合数” 的题目是这样的:
给定一个有且仅有 5 位,且各个数位互不相同的十进制正整数 n。你可以重新排列 n 的各个数位,
但需要保证重新排列得到的整数 n
′ 没有前导零。请问重新排列数位得到的 n
′ 能否为合数?若能为合数,
请求出一个满足条件的 n
′。
例如,当 n = 12345 时,任意排列得到的 n
′ 均是合数,因此可以任意取 n
′。当 n = 13579 时,可以
重新排列数位得到合数 n
′ = 97531 = 7 × 13933。
一个正整数是合数,当且仅当它可以分解为两个不小于 2 的整数的乘积。
现在,小 A 带着他的题目来到赛场上求助。你能帮助小 A 解决这个题目吗?
输入格式
本. 题. 测. 试. 点. 包. 含. 多. 组. 数. 据。.
第一行,一个正整数 T(1 ≤ T ≤ 105),表示数据组数。
对于每组数据:
一行,一个正整数 n(104 ≤ n < 105),保证 n 的各个数位互不相同。
输出格式
对于每组数据:
输出一行,一个整数。若能重新排列 n 的数位得到合数 n
′ 则输出 n
′,否则输出 −1。
样例
standard input
5
12345
12345
12345
12345
13579
standard output
12345
54321
13524
45123
97531
提示
样例即是题目描述中给出的例子。

二思路解析

共五位数且不能重复,对示例遍历,遇到5或者能2的倍数和最后一位交换(特例,末尾为0,且首位为2的倍数这不能交换)

三代码展示

#include
#include
#include

using namespace std;

int main()
{
int t; cin >> t;
string a;
while (t–)
{
cin >> a;
int t;
if (a[4] != ‘0’)
{
for (int i = 0; i < 4; i++)
{

			t = a[i] - '0';
			if (t % 2 == 0 || t == 5)
			{
				swap(a[i], a[4]); break;
			}
		}
	}
	cout << a << endl;
}

return 0;

}

M - 有效算法

一.题目展示

oblem M. 有效算法
给出长度为 n 的正整数序列 {an} 和 {bn}。对于每个 ai(1 ≤ i ≤ n),进行恰好一次以下操作:
• 将 ai 变成满足 |ai − x| ≤ k × bi 的任意整数 x。
请你求出最小的非负整数 k,使得存在至少一种方法使得操作后序列 {an} 所有数都相等。
输入格式
本. 题. 测. 试. 点. 包. 含. 多. 组. 数. 据。.
第一行包含一个正整数 T(1 ≤ T ≤ 1.5 × 105),表示数据组数。
对于每组数据:
第一行包含一个正整数 n(2 ≤ n ≤ 3 × 105)。
第二行包含 n 个正整数 a1, a2, . . . , an(1 ≤ ai ≤ 109)。
第三行包含 n 个正整数 b1, b2, . . . , bn(1 ≤ bi ≤ 109)。
保证单个测试点中所有数据的 ∑n ≤ 3 × 105。
输出格式
对于每组数据:
输出一行一个整数,表示答案。
样例
standard input
2
4
8 3 3 5
1 2 3 2
5
4 3 4 5 6
3 1 3 1 1
standard output
2
2
提示
对于样例一,可以令 ai 全变为 6。
对于样例二,可以令 ai 全变为 5。

二.思路解析

|ai − x| ≤ k × bi 可转化为ai-kbi=x和ai+kbi=x
前者求最大,后者求最小,即可找到满足两者条件的x

三.代码展示

#include
#include

using namespace std;
const int N=3e5+30;
long long int ai[N],bi[N],n;
int er(int k)
{
long long int minn=1e9,maxx=0;
for(int i=0;i<n;i++)
{
maxx=max(maxx,ai[i]-kbi[i]);
minn=min(minn,ai[i]+k
bi[i]);
}//cout<<" I:J “<<maxx<<” “<<minn<<endl;
if(maxx<=minn)return 1;
else return 0;
}
int main()
{
int t;cin>>t;
while(t–)
{
cin>>n;
for(int i=0;i<n;i++)cin>>ai[i];
for(int j=0;j<n;j++)cin>>bi[j];
long long int l=0,r=1e9,mid=0;
while(l<r)//由于数据范围较大不适合遍历,所以采用二分搜索
{
mid=(l+r)/2;//cout<<” gy "<<mid<<endl;
if(er(mid))r=mid;
else l=mid+1;
}
cout<<l<<endl;
}

return 0;

}

  • 17
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值