2022年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛

2022年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com)

1.Komorebi的数学课(快速幂)

2.Setsuna的K数列(进制)

3.G   天气预报 (二分+前缀和)

4.史东薇尔城(最短路径dijstra)


1.Komorebi的数学课(快速幂)

2022年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛_第1张图片

#include 
using namespace std;
typedef long long ll;
int main(){
    ll n;
    cin>>n;
    ll m=n,ans=1,k=n;
    while(m){
        if(m%2==1){
            ans=ans*n;
            ans%=(k+2);
        }
        n=n*n;
        n%=(k+2);
        m/=2;
    }
    cout<

例如:计算3的10次方时,

3^10=(3^2)^5  = 9^5 =9*9^4  =9*(81)^2……

遇到奇数幂时,先给ans乘上原来的数,再将原数平方,即做到log2n的时间复杂度

2.Setsuna的K数列(进制)

2022年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛_第2张图片

#include 
using namespace std;
typedef long long ll;
const long long mod=1e9+7;
ll ppow(ll k,ll i){//快速幂求次方
     ll ans=1;
    while(i){
        if(i%2==1){
            ans=ans*k;
            ans%=mod;
        }
        k=k*k%mod;
        i/=2;
    }
    return ans%mod;
}
int main(){
    ll sum=0;
      ll n,k;
    cin>>n>>k;
    ll i=0;
    while(n){//将n转化为二进制数按k进制还原
       
        int a=n%2; //cout<

思路:

不难发现, K 数列本质就是每一个 K 进制位只能取 0 1 ,这很像二进制,即第 n 个数就是
n 表示成二进制然后按 K 进制还原即可。
3.剪绳子
2022年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛_第3张图片

#include 
using namespace std;
const int N=1e6+10;
int c[N],sum[N];
int mp[1000100];
int main(){
    mp[0]=0;
    mp[1]=1000000;
   int q;
    cin>>q;
    int k=2;
    while(q--){
        char e;
        cin>>e;
        if(e=='C'){
          double f;
            cin>>f;
            mp[k++]=f*100000+0.5;
        }
        else{
           double ll;
            cin>>ll;
            int l=ll*100000+0.5;
            sort(mp,mp+k);
           for(int i=0;i=mp[i]&&l<=mp[i+1]){
                  cout<

3.天气预报(二分加前缀和)

2022年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛_第4张图片

 

#include 
using namespace std;
typedef long long ll;
const int N=1e6+9;
ll aa[N],bb[N];
int n,a,b;
int check(ll i,ll j){//检查该区间的晴朗天数和坏天气天数是否满足要求
    ll p=aa[j]-aa[i-1];
    ll q=bb[j]-bb[i-1];
    if(p>=a&&q>=b)return 1;
    else return 0;
}
int main(){
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    cin>>n>>a>>b;
    string s;
    cin>>s;
    ll ans=0;
    //cout<

4.史东薇尔城(最短路径)

2022年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛_第5张图片

 

#include 
using namespace std;
typedef long long ll;
typedef pairp;
const ll N=1e6+10;
vector

h[N]; ll dist[N],st[N]; void dijstra(){ memset(dist,0x3f,sizeof(dist));//初始化每个点到根节点的距离为无穷大 priority_queue,greater

>q; q.push({0,1});//放入根节点 dist[1]=0;//根节点距自己的距离为0 while(!q.empty()){//队列为空时跳出循环 p now=q.top();q.pop();//取队头元素 int ne=now.second;//下一个距离自己最近的点名 // int dis=now.first;// if(st[ne])continue; st[ne]=1; for(auto it:h[ne]){//遍历该点周围连接的点 if(dist[it.first]>dist[ne]+it.second){//松弛操作 dist[it.first]=dist[ne]+it.second;//如果该点到根节点的距离大于,自己的前驱节点到根节点的距离加上到自己的距离,就更新 q.push({dist[it.first],it.first});//把目前最新更新的点加入队列 } } } } int main(){ int n,m; cin>>n>>m; for(int i=1;i<=m;i++){ int v,w,d; cin>>v>>w>>d; h[v].push_back({w,d});//建立图(连边加权值) h[w].push_back({v,d});//无向图,两点能相互到达 } dijstra();//最短路径搜素 int t; cin>>t; while(t--){ int x,y; cin>>x>>y; cout<

关于dijstta算法:Dijkstra算法详解(完美图解、趣学算法)_wjyGrit的博客-CSDN博客_dijkstra算法

你可能感兴趣的:(比赛错题集,c++,算法)