首页 > 其他分享 >蓝桥杯国赛训练第一周

蓝桥杯国赛训练第一周

时间:2024-05-07 13:45:37浏览次数:21  
标签:yy return 第一周 杯国赛 路径 蓝桥 int xx mp

P1491 集合位置 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

主要在于 $A*$ 函数中估价函数,这里给出最好想也是我想出来的一种方法,也就是当黑白棋子各自都在对方的领域上,那么就可以考虑一种最小的消耗情况,也就是走一步顶两不,也就是黑白互换,那么此时所需要消耗的最小步数就是不符合棋子的最大值

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10,mod=1e9+7;
char mp[10][10];
int dx[]={1,1,-1,-1,2,2,-2,-2},dy[]={2,-2,2,-2,1,-1,1,-1};
int opposite[8]={3,2,1,0,7,6,5,4};
int f(){
    int black=0,white=0;
    for(int i=1;i<=5;i++) if(mp[1][i]!='1') black++;
    for(int i=2;i<=5;i++) if(mp[2][i]!='1') black++;
    for(int i=4;i<=5;i++) if(mp[3][i]!='1') black++;
    if(mp[4][5]!='1') black++;
    if(mp[2][1]!='0') white++;
    for(int i=1;i<=2;i++) if(mp[3][i]!='0') white++;
    for(int i=1;i<=4;i++) if(mp[4][i]!='0') white++;
    for(int i=1;i<=5;i++) if(mp[5][i]!='0') white++;
    return max(black,white);
}
bool dfs(int now,int maxdep,int x,int y,int lst){
    int cnt=f();
    if(now+f()>maxdep) return false;
    if(!cnt) return true;
    for(int i=0;i<8;i++){
        int xx=x+dx[i],yy=y+dy[i];
        if(xx<1||xx>5||yy<1||yy>5||opposite[i]==lst) continue;
        mp[x][y]=mp[xx][yy],mp[xx][yy]='*';
        if(dfs(now+1,maxdep,xx,yy,i)) return true;
        mp[xx][yy]=mp[x][y],mp[x][y]='*';
    }
    return false;
}
void solve(){
    int x,y;
    for(int i=1;i<=5;i++)
        for(int j=1;j<=5;j++){
            cin>>mp[i][j];
            if(mp[i][j]=='*') x=i,y=j;
        }
    int dep=0;
    while(dep<=15&&!dfs(0,dep,x,y,-1)) ++dep;
    cout<<(dep<=15?dep:-1)<<'\n';
}
signed main(){
   std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);int t;cin>>t;while(t--)solve();
}

P1491 集合位置 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题意明了,也就是求出非严格的次短路即可,那么我们首先跑一遍最短路并储存最短路径

考虑一条最短路径上的边,可以肯定的是若最短路径中的一条边消失,其它边对终点的贡献仍然是最小的,所以说我们只需要删除一个最短路径上的边然后继续跑最短路就可以了

正确性: 对于一个最短路径,图中其它路径必然不存在更优的路径,若删去最短路径的一条边之后,最短路径一定会改变,此时再次求一遍最短路径,那么这个路径一定不劣于其他路径,且一定不优于不去除边的最短路径,故为次短路径

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10,mod=1e9+7;
vector<pair<int,int>>point(N);
vector<pair<int,double>>g[N];
vector<int>pre(N);
vector<double>dijkstra(int n,int aa,int bb){
    vector<double>dist(n+1,1e9);
    vector<bool>vis(n+1,false);
    priority_queue<pair<double,int>,vector<pair<double,int>>,greater<pair<double,int>>>que;
    que.push({0,1}),dist[1]=0;
    while(!que.empty()){
        auto now=que.top(); que.pop();
        int x=now.second;
        double y=now.first;
        if(vis[x]) continue; vis[x]=true;
        for(auto u:g[x]){
            int v=u.first;
            double w=u.second;
            if((x==aa&&v==bb)||(x==bb&&v==aa)) continue;
            if(dist[v]>y+w){
                dist[v]=y+w,que.push({dist[v],v});
                if(aa==-1) pre[v]=x;
            }
        }
    }
    return dist;
}
signed main()
{
    std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    int n,m,a,b; cin>>n>>m;
    cin>>a>>b;
    point[1]={a,b};
    for(int i=2;i<=n-1;i++){
        cin>>a>>b;
        point[i]={a,b};
    }
    vector<vector<double>>dis(n+1,vector<double>(n+1));
    cin>>a>>b,point[n]={a,b};
    auto get_distance=[](pair<int,int> a,pair<int,int> b){
        int x=a.first,y=a.second,xx=b.first,yy=b.second;
        return (double)(sqrt((x-xx)*(x-xx)+(y-yy)*(y-yy)));
    };   
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            dis[i][j]=get_distance(point[i],point[j]);
    for(int i=1;i<=m;i++){
        cin>>a>>b;
        double c=dis[a][b];
        g[a].push_back({b,c}),g[b].push_back({a,c});
    }
    vector<double>ans=dijkstra(n,-1,-1);
    // for(int i=1;i<=n;i++) cout<<ans[i]<<' '; cout<<'\n';
    double res=1e9;
    for(int i=n;i!=1;i=pre[i]){
        int aa=i,bb=pre[i];
        ans=dijkstra(n,aa,bb);
        // for(int i=1;i<=n;i++) cout<<ans[i]<<' '; cout<<'\n';
        res=min(res,ans[n]);
    }
    if(res==1e9) cout<<"-1"<<'\n';
    else printf("%.2lf\n",res);
    return 0;
}

P2149 [SDOI2009] Elaxia的路线 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

刚开始看没太懂题意,于是看了下题解,用到好多算法,感觉太过复杂,于是自己尝试着去解

了解题意后会发现,本题要求是求出两条路径中的公共边,这些公共边的边权相加即为答案,那么主要难点就在于如何去求所有的最短路径

标签:yy,return,第一周,杯国赛,路径,蓝桥,int,xx,mp
From: https://www.cnblogs.com/o-Sakurajimamai-o/p/18177064

相关文章

  • 【题解】爬山 蓝桥杯2024省B
    题目链接:P10429[蓝桥杯2024省B]拔河[蓝桥杯2024省B]拔河题目描述小明是学校里的一名老师,他带的班级共有\(n\)名同学,第\(i\)名同学力量值为\(a_i\)。在闲暇之余,小明决定在班级里组织一场拔河比赛。为了保证比赛的双方实力尽可能相近,需要在这\(n\)名同学中挑选......
  • 蓝桥杯-翻硬币
    小明正在玩一个“翻硬币”的游戏。桌上放着排成一排的若干硬币。我们用*表示正面,用o表示反面(是小写字母,不是零)。比如,可能情形是:**oo***oooo如果同时翻转左边的两个硬币,则变为:oooo***oooo现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个......
  • 蓝桥杯-带分数
    100可以表示为带分数的形式:100=3+69258/714还可以表示为:100=82+3546/197注意特征:带分数中,数字1∼9分别出现且只出现一次(不包含0)。类似这样的带分数,100有11种表示法。输入格式一个正整数。输出格式输出输入数字用数码1∼9不重复不遗漏地组成带分数表示的......
  • 蓝桥杯-四平方和
    四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多4个正整数的平方和。如果把0包括进去,就正好可以表示为4个数的平方和。比如:5=0^2+0^2+1^2+2^27=1^2+1^2+1^2+2^2对于一个给定的正整数,可能存在多种平方和的表示法。要求你对4个数排序:0≤a......
  • 蓝桥杯-k倍区间
    给定一个长度为N的数列,A1,A2,…AN,如果其中一段连续的子序列Ai,Ai+1,…Aj之和是K的倍数,我们就称这个区间[i,j]是K倍区间。你能求出数列中总共有多少个K倍区间吗?输入格式第一行包含两个整数N和K。以下N行每行包含一个整数Ai。输出格式输出一个整数,代表K倍......
  • 蓝桥杯-分巧克力
    儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。小明一共有N块巧克力,其中第i块是Hi×Wi的方格组成的长方形。为了公平起见,小明需要从这N块巧克力中切出K块巧克力分给小朋友们。切出的巧克力需要满足:形状是正方形,边长是整数大小相同......
  • 2024第十五届蓝桥杯网络安全赛项部分题目 WriteUp
    2024第十五届蓝桥杯网络安全赛项部分题目WriteUp爬虫协议根据提示,访问/robots.txt,得到敏感路径/38063b612387b10e22f4bd0d71a46a4e/,访问其中的/9de33df789dc91e984a091e6dce2dfb1得到flag。flag{494547b4-f13f-47de-b1a5-a99f20495cd7}packet使用过滤器tcpcontains"fla......
  • 第十五届蓝桥杯 网络安全赛道 ezjava
    1.前言前一秒还在robots.txt找flag,下一秒就java内存马了,还不出网,这很......
  • 蓝桥杯-数的划分(DFS)
    0.题目问题描述将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。例如:n=7,k=3,下面三种分法被认为是相同的。1,1,5;1,5,1;5,1,1;问有多少种不同的分法。输入格式n,k输出格式一个整数,即不同的分法样例输入73样例输出4数据......
  • 2024蓝桥杯省赛C/C++程序设计A组题目简析
    2024蓝桥杯省赛C/C++程序设计A组题目简析A题意:计算一段区间内日期的中文表达的总笔画数>50的天数按照题意枚举即可。注意个位数字前面需要加一个“零”,也就是多13笔。B题意:\(5\times5\)的棋盘下五子棋,最终下满棋盘并和棋的情况数dfs或者遍历二进制去枚举棋子位置的情况均可......