2024河南第六届CCPC

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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值