欢迎光临
我们一直在努力

【寒假集训】2026.2.27

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

    赞(0)
    未经允许不得转载:171主机测评 » 【寒假集训】2026.2.27
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址