T1:


本题AC代码:
#include<bits/stdc++.h>
using namespace std;
long long a[50];
int main(){
long long n;
cin>>n;
long long a[50];
if(n==1){cout<<0;return 0;}
long long cnt=0,aa=n-1;
while(aa){
a[++cnt]=aa%5;
aa/=5;
}
for(long long i=cnt;i>=1;i–)cout<<a[i]*2;
return 0;
}
本题思路:
纯偶数由数字 0、2、4、6、8 组成,按从小到大排列。题目要求输出第 n 个纯偶数。观察纯偶数的排列规律,可以发现其本质上是一个五进制数的表示问题,其中数字 0、2、4、6、8 分别对应五进制中的 0、1、2、3、4。
T2:



本题AC代码:
#include<bits/stdc++.h>
using namespace std;
long long n,ans=0;
long long dp[1000001][4];
char a[1000005];
int main(){
cin>>n;
for(long long i=1;i<=n;i++){
cin>>a[i];
}
for(long long i=1;i<=n;i++){
dp[i][1]=dp[i-1][1]+(a[i]=='C');
dp[i][2]=dp[i-1][2]+(a[i]=='S')*dp[i-1][1];
dp[i][3]=dp[i-1][3]+(a[i]=='P')*dp[i-1][2];
}
cout<<dp[n][3];
return 0;
}
本题思路:
这个问题要求统计字符串中所有满足顺序为 'C'、'S'、'P' 的三元组 (i, j, k) 的数量。关键在于高效地计算每个 'S' 和 'P' 对最终答案的贡献。
T3:



本题AC代码:
#include<bits/stdc++.h>
using namespace std;
long long n,ans=2;
int quick_mi(long long a,long long n,long long q){
long long ans=1;
while(n){
if(n%2){
ans=(ans*a)%10007;
n–;
}
else{
a=(a*a)%10007;
n/=2;
}
}
return ans;
}
int main(){
cin>>n;
cout<<quick_mi(3,n,10007)*2%10007;
return 0;
}
本题思路:题目要求在 2*n 的网格中填入三个给定的数(1000000007, 9223372036854775783, 1000000000000000003),要求相邻格子(上下或左右)的数字互质。由于这三个数两两互质,因此只需要确保相邻格子不填入相同的数即可。
T4:



本题AC代码:
#include<bits/stdc++.h>
using namespace std;
struct node{
int n, step;
};
int n, m;
int a, b;
bool v[100005];
vector<int> c[100005];
queue<node> q;
int bfs(){
q.push({1, 0});
while(!q.empty()){
node n1 = q.front();
q.pop();
if (n1.n == n){
return n1.step;
}
for (int j = 0; j < c[n1.n].size(); j++){
node n2 = {c[n1.n][j], n1.step + 1};
if (!v[n2.n]){
q.push(n2);
v[n2.n] = 1;
}
}
}
}
int main(){
cin >> n >> m;
for (int i = 1; i <= m; i++){
cin >> a >> b;
c[a].push_back(b);
c[b].push_back(a);
}
cout << bfs();
return 0;
}
本题思路:
题目要求计算从节点1到节点n的最短路径长度,其中所有边的长度均为1。由于图是连通无向图,可以确保存在从1到n的路径。适合使用广度优先搜索(BFS)算法来解决,因为BFS在无权图中能高效找到最短路径。
T5:



本题AC代码:
#include<bits/stdc++.h>
using namespace std;
long long a[1000005];
long long n;
struct node{
long long x;
friend bool operator<(node n1,node n2){
return n1.x>n2.x;
}
};
priority_queue<node>st;
int main(){
cin>>n;
for(long long i=1;i<=n;i++){
cin>>a[i];
st.push({a[i]});
}
long long ans=0;
while(st.size()>=2){
node x=st.top();
long long xx=x.x;
st.pop();
node y=st.top();
long long yy=y.x;
st.pop();
ans+=xx+yy;
st.push({xx+yy});
}
cout<<ans;
return 0;
}
本题思路:
为了最小化总合并代价,每次应该合并当前最小的两个文件。这样可以确保较大的文件在后续合并中被较少地重复计算。具体步骤如下:
这种方法确保了每次合并的代价最小,从而总代价最小。
T6:



本题AC代码:
#include<bits/stdc++.h>
using namespace std;
long long n;
long long x,a=0,b=0;
int main(){
cin>>n;
while(n–){
cin>>x;
a=b=0;
for(int i=30;i>=0;i–){
if(x&(1<<i)){
if(a==0){
a|=(1<<i);
}
else{
b|=(1<<i);
}
}
else if((a|(1<<i))<=x){
a|=(1<<i);
b|=(1<<i);
}
}
cout<<a+b<<'\\n';
}
return 0;
}
本题思路:
对于给定的 x,计算其最高有效位 m,然后构造 a = 2^m – 1 和 b = x \\oplus a。验证 b \\le x 后,a + b 即为答案。
作者之前的文章:
day1:https://blog.csdn.net/Matthew_zhu_/article/details/158290602?spm=1001.2014.3001.5501
day2:https://blog.csdn.net/Matthew_zhu_/article/details/158320728?spm=1001.2014.3001.5501
day3:https://blog.csdn.net/Matthew_zhu_/article/details/158355986?spm=1001.2014.3001.5501
day4:https://blog.csdn.net/Matthew_zhu_/article/details/158391223?spm=1001.2014.3001.5501
day5:https://blog.csdn.net/Matthew_zhu_/article/details/158431065?spm=1001.2014.3001.5501



