Problem 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是幸运数。你能用计算机辅助他的计算吗?
#include<bits/stdc++.h>
using namespace std;
void solve()
{
int n,d;
cin>>n>>d;
long long l=to_string(n).size();//算n的位数,添加预留位.
long long ans=(1234567890*1ll+d);//需要乘以1LL以确保数据类型正确。
ans=ans*pow(10,l);
ans=(ans+n)/n;加上n,除以n,得到结果
cout<<ans<<'\n';
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
long long t;
cin>>t;
while(t--)
solve();
return 0;
}
Problem B. 扫雷 1
T0xel 喜欢玩扫雷,但是他玩的扫雷游戏有名为“地雷探测器”的特殊道具。
具体来说,T0xel 会进行n轮扫雷。每轮扫雷开始之前,T0xel会获得1枚扫雷币。扫雷币在每轮扫
雷结束后不会回收,可以保留至下一轮扫雷。T0xel知道,在第i轮(1≤i≤n)扫雷中,花费ci 枚扫
雷币可以购买一个地雷探测器,清除地图中的一个雷。地雷探测器在一轮扫雷中可以购买任意次。
现在T0xel 想知道,在这n轮扫雷中最多能购买多少个地雷探测器呢?
思路:就是贪心思想
#include <iostream>
#include <vector>
using namespace std;
void Solved() {
int n;
cin >> n;
vector<pair<int, int>> a;//声明名为 a 的向量容器,存储的元素类型为 pair<int, int>,即整数对。
for(int i = 1; i <= n; i++) {
int x;
cin >> x;
while(!a.empty() && a.back().first >= x)
a.pop_back();
a.push_back(make_pair(x, i));
}
int res = a[0].second / a[0].first;
int t = a[0].second % a[0].first, len = a.size();
for(int i = 1; i < len; i++) {
res += (a[i].second - a[i - 1].second + t) / a[i].first;
t = (a[i].second - a[i - 1].second + t) % a[i].first;
}
cout << res << endl;
}
int main() {
Solved();
return 0;
}
Problem F. 优秀字符串
小A认为,一个字符串S是优秀字符串,当且仅当:
• S 的长度|S|恰好为5;
• S 的第三个字符与第五个字符相同;
• S 的前四个字符互不相同。
例如henan 是优秀字符串,但query、problem、queue 不是,因为:
• query 的第三个字符为e,而第五个字符为y;
• problem 的长度不为 5;
• queue 的前四个字符中u出现了两次。
求出这些字符串中优秀字符串的数量。
思路:前一半字符和后面相等
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
int sum=0;
cin>>n;
while(n--)
{
string s;
cin>>s;
if(s.size()==5)
if(s[2]==s[4]&&(s[1]!=s[0]&&s[0]!=s[2]&&s[0]!=s[3]&&s[1]!=s[2]&&s[1]!=s[3]&&s[2]!=s[3]))
sum++;
}
cout<<sum;
return 0;
}码片
Problem 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解决这个题目吗?
输入格式
.
思路:末尾是0,2,4,5,6,8肯定是合数,如果末尾不是,那么五个数字里起码有一个是,和末尾交换就行
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
for(int j=0;j<n;j++)
{
string s;
cin>>s;
if(s[4]=='0'||s[4]=='2'||s[4]=='4'||s[4]=='5'||s[4]=='8'||s[4]=='6')
cout<<s<<"\n";
else
{
for(int i=0;i<5;i++)
{ if(s[i]=='0'||s[i]=='2'||s[i]=='4'||s[i]=='5'||s[i]=='8'||s[i]=='6')
{
swap(s[i],s[4]);
cout<<s<<"\n";
break;
}
}
}
}
return 0;
}
Problem M. 有效算法
给出长度为n的正整数序列{an}和{bn}。对于每个ai(1≤i≤n),进行恰好一次以下操作:
• 将ai 变成满足|ai−x|≤k×bi 的任意整数x。
请你求出最小的非负整数k,使得存在至少一种方法使得操作后序列{an}所有数都相等。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define MAX_N 300005
int T, n;
long long a[MAX_N], b[MAX_N];
bool check(long long k) {
long long mi = 0, mx = 1e18;
for (int i = 1; i <= n; i++) {
mi = max(mi, a[i] - k * b[i]);
mx = min(mx, a[i] + k * b[i]);
if (mi > mx) return false;
}
return true;
}
void solved()
{
cin >> T;
while (T--)
{
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= n; i++)
cin >> b[i];
long long l = 0, r = 1e10, mid, ans = -1;
while (l <= r)
{
mid = (l + r) / 2;
if (check(mid))
{
ans = mid;
r = mid - 1;
}
else
l = mid + 1;
}
cout << ans << endl;
}
}
int main()
{
solved();
return 0;
}