Codeforces Round 181 (Rated for Div. 2)
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 secondvoid 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,
-
计算gcd:
-
gcd(12,18)=6
-
简化坐标:a'=12/6=2,b'=18/6=3
-
-
判断与k的关系:
-
a'=2 ≤5(满足)
-
b'=3 ≤5(满足)
-
此时输出1(因为可以用一个操作完成)
-
否则需要至少两个成本为1的操作(总成本为2),因为无法在单次k的限制内完成移动。
例如:
a=30,b=42,k=5
-
计算gcd:
-
gcd(30,42)=6
-
简化坐标:a'=30/6=5,b'=42/6=7
-
-
判断与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;elsecout<<"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;
}