Codeforces Round 181 (Rated for Div. 2)

发布于:2025-07-27 ⋅ 阅读:(16) ⋅ 点赞:(0)

A. Difficult Contest

题目传送门:Problem - A - Codeforces或者CF2125A Difficult Contest - 洛谷

思路分析:

这道题目当时写的时候就大意的认为只要让字符串不是“FFT”或者“NTT”就行,我就直接输出了随机的一串字符串,其实不是这样的,仔细读题目,是要输出排列后没有难度的字符串,那就是要想办法让不让‘F’在‘T’之前,和不让‘N’在‘T’前面,这样操作后就不会再有难度了,核心思路是通过 sort函数先对字符串进行默认的升序排序,再通过 reverse函数将结果反转,从而得到降序排列的字符串,最终直接输出结果。

实现代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define pii pair<int,int>
#define fi first
#define se second

void slove() {
	string s;
	cin >> s;
	sort(s.begin(), s.end());
	reverse(s.begin(), s.end());
	cout << s << endl;
}
signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int _ = 1;
	cin >> _;
	while (_--)
		slove();
	return 0;
}

B. Left and Down

题目传送门:Problem - B - Codeforces或者CF2125B Left and Down - 洛谷

思路分析:

这道题目要求我们计算将机器人从初始位置(a,b)移动到原点(0,0)的最小成本。解题的关键在于利用最大公约数(gcd)来简化问题:首先计算a和b的gcd得到t,然后将坐标简化为(a/t,b/t)。如果简化后的两个坐标值都小于等于k,说明可以通过一个成本为1的操作直接到达原点。

例如::a=12,b=18,k=5,

  1. ​计算gcd​​:

    • gcd(12,18)=6

    • 简化坐标:a'=12/6=2,b'=18/6=3

  2. ​判断与k的关系​​:

    • a'=2 ≤5(满足)

    • b'=3 ≤5(满足)

    • 此时输出1(因为可以用一个操作完成)

否则需要至少两个成本为1的操作(总成本为2),因为无法在单次k的限制内完成移动。

例如:

a=30,b=42,k=5

  1. ​计算gcd​​:

    • gcd(30,42)=6

    • 简化坐标:a'=30/6=5,b'=42/6=7

  2. ​判断与k的关系​​:

    • a'=5 ≤5(满足)

    • b'=7 >5(不满足)

    • 此时输出2(因为需要至少两个操作,有步数限制,可以先走到(0,2),再走到(0,0))

实现代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define pii pair<int,int>
#define fi first
#define se second
const int N=101;

void slove(){
int a,b,k;
cin>>a>>b>>k;
 int t=__gcd(a,b);
 a=a/t;
 b=b/t;
 if(a<=k&&b<=k)
 cout<<"1"<<endl;
 else
 cout<<"2"<<endl;
}
signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int _=1;
	cin>>_;
	while(_--)
	slove();
	return 0;
}

C. Count Good Numbers

题目传送门:CF2125C Count Good Numbers - 洛谷或者CF2125C Count Good Numbers - 洛谷

思路分析:

这道题目要求计算区间[l, r]内不能被2、3、5、7整除的数的个数。采用容斥原理,通过系统性地加减不同组合的倍数数量来避免重复计算。具体实现是:先计算区间总数,减去所有单个质数的倍数,再加回两两质数的公倍数,接着减去三个质数的公倍数,最后加回四个质数的公倍数。这种方法通过层次化的加减操作精确统计了不满足条件的数的数量,最终用总数减去这个值得出结果。代码中ff函数高效计算区间内能被某数整除的数的个数。

实现代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define pii pair<int,int>
#define fi first
#define se second
const int N=101;
// 计算区间 [l, r] 内能被 x 整除的数的个数
int ff(int l,int r,int x)
{
	return r/x-(l-1)/x;
}
void slove(){
int t,l,r;
cin>>t;
while(t--)
{
cin>>l>>r;
 // 容斥原理计算不能被 2、3、5、7 整除的数的个数
    cout << (r - l + 1)          // 区间总数
            - ff(l, r, 2)         // 减去能被 2 整除的数
            - ff(l, r, 3)         // 减去能被 3 整除的数
            - ff(l, r, 5)         // 减去能被 5 整除的数
            - ff(l, r, 7)         // 减去能被 7 整除的数
            + ff(l, r, 6)         // 加回能被 2 和 3 同时整除的数(即 6 的倍数)
            + ff(l, r, 10)        // 加回能被 2 和 5 同时整除的数(即 10 的倍数)
            + ff(l, r, 14)        // 加回能被 2 和 7 同时整除的数(即 14 的倍数)
            + ff(l, r, 15)        // 加回能被 3 和 5 同时整除的数(即 15 的倍数)
            + ff(l, r, 21)        // 加回能被 3 和 7 同时整除的数(即 21 的倍数)
            + ff(l, r, 35)        // 加回能被 5 和 7 同时整除的数(即 35 的倍数)
            - ff(l, r, 30)        // 减去能被 2、3、5 同时整除的数(即 30 的倍数)
            - ff(l, r, 42)        // 减去能被 2、3、7 同时整除的数(即 42 的倍数)
            - ff(l, r, 70)        // 减去能被 2、5、7 同时整除的数(即 70 的倍数)
            - ff(l, r, 105)       // 减去能被 3、5、7 同时整除的数(即 105 的倍数)
            + ff(l, r, 210)       // 加回能被 2、3、5、7 同时整除的数(即 210 的倍数)
            << endl;
}
}
signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int _=1;
	//cin>>_;
	while(_--)
	slove();
	return 0;
}


网站公告

今日签到

点亮在社区的每一天
去签到