蓝桥杯训练赛

P9241 [蓝桥杯 2023 省 B] 飞机降落 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题解:一个暴力搜索,n小啊

我们直接跑每一个排列方式即可

判断条件就是如果不满足t+d>ti那没就不要,满足则递归向下跑不断更新时间即可

#include <bits/stdc++.h>
//#pragma GCC optimize("Ofast")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
//#define double long double
//#define int long long
#define endl '\n'
using namespace std;
const int N=1e6+10,M=1e1;
const int INF = 0x3f3f3f3f;
const int mod=1e9+7;
typedef pair<int,int> PII;
int kmp(int a,int k,int p)
{
    int ans=1;
    while (k)
    {
        if(k&1) ans=ans*a%p;
        k>>=1;
        a=a*a;
    }
    return ans;
}


struct G{
    int t,d;
    int l;
}a[N];
int vis[N];
int n;
int dfs(int u,int ti)
{
    if(u>n)
    {
        return 1;
    }
    for(int i=1;i<=n;i++)
    {
        if(vis[i] || a[i].t+a[i].d<ti) continue;
        vis[i]=1;
        if(dfs(u+1,max(ti,a[i].t)+a[i].l))
        {
            vis[i]=0;
            return 1;
        }
        vis[i]=0;
    }
    return 0;

}
void solve()
{

    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int x,y,z;
        cin>>x>>y>>z;
        a[i]={x,y,z};
    }
    memset(vis,0,sizeof vis);
    if(dfs(1,0))
    {
        cout<<"YES"<<endl;
    }
    else cout<<"NO"<<endl;

}
signed main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    int T=1;
    cin>>T;
    while(T--){
        solve();
    }
    return 0;
}

 P8674 [蓝桥杯 2018 国 B] 调手表 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题解:假设a到b 那么距离是a-b等于c,也就是说我们只需要看看怎么维护这个距离的答案即可

我们就把转化成0到各个点的最短路即可

这个我们直接跑一个宽搜最短路即可

#include <bits/stdc++.h>
//#pragma GCC optimize("Ofast")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
//#define double long double
//#define int long long
#define endl '\n'
using namespace std;
const int N=1e6+10,M=1e1;
const int INF = 0x3f3f3f3f;
const int mod=1e9+7;
typedef pair<int,int> PII;
int kmp(int a,int k,int p)
{
    int ans=1;
    while (k)
    {
        if(k&1) ans=ans*a%p;
        k>>=1;
        a=a*a;
    }
    return ans;
}

int vis[N];
int ans;
int ti[N];
int n,k;
void bfs(int a)
{
    vis[a]=1;
    queue<int> q;
    q.push(a);
    while (!q.empty())
    {
        int x=q.front();
        q.pop();
        ans=max(ans,ti[x]);
        int y=(x+k)%n;
        int yy=(x+1)%n;
        if(!vis[y])
        {
            ti[y]=ti[x]+1;
            vis[y]=1;
            q.push(y);
        }
        if(!vis[yy])
        {
            ti[yy]=ti[x]+1;
            q.push(yy);
            vis[yy]=1;
        }
    }
}
void solve()
{

    cin>>n>>k;
    bfs(0);
    cout<<ans<<endl;
}
signed main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    int T=1;
//    cin>>T;
    while(T--){
        solve();
    }
    return 0;
}

 P9242 [蓝桥杯 2023 省 B] 接龙数列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题解:dp题

dp[i]代表以i结尾的最长子序列是多少

然后我们可以推出转移方程

一种情况代表这个数可以和前面的接上那么就要

dp[x]+1代表头和尾衔接,个数加一 就是以y结尾和前面字串相加加一

一个就是以y结尾不变的对比两个值看谁大即可转移

dp[y]=max(dp[y],dp[x]+1);
#include <bits/stdc++.h>
//#pragma GCC optimize("Ofast")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
//#define double long double
#define int long long
#define endl '\n'
using namespace std;
const int N=1e5+10,M=1e1;
const int INF = 0x3f3f3f3f;
const int mod=1e9+7;
typedef pair<int,int> PII;
int kmp(int a,int k,int p)
{
    int ans=1;
    while (k)
    {
        if(k&1) ans=ans*a%p;
        k>>=1;
        a=a*a;
    }
    return ans;
}

string s[N];
int dp[N];
map<char,int> mp;
void solve()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>s[i];
    }

    for(int i=1;i<=n;i++)
    {
        int x=s[i][0]-'0';
        int y=s[i][s[i].size()-1]-'0';
        dp[y]=max(dp[y],dp[x]+1);
    }
    int ans=0;
    for(int i=0;i<=9;i++)
    {
        ans=max(ans,dp[i]);
    }
    cout<<n-ans<<endl;

}
signed main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    int T=1;
//    cin>>T;
    while(T--){
        solve();
    }
    return 0;
}

 P8665 [蓝桥杯 2018 省 A] 航班时间 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题解:按照题目模拟即可

这里注意一下,可能需要whlie判断一下有没有后面的加1什么的

然后我们直接相加减转换一下即可

#include <bits/stdc++.h>
//#pragma GCC optimize("Ofast")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
//#define double long double
//#define int long long
#define endl '\n'
using namespace std;
const int N=1e5+10,M=1e1;
const int INF = 0x3f3f3f3f;
const int mod=1e9+7;
typedef pair<int,int> PII;
int kmp(int a,int k,int p)
{
    int ans=1;
    while (k)
    {
        if(k&1) ans=ans*a%p;
        k>>=1;
        a=a*a;
    }
    return ans;
}

int sta()
{
    int a,b,c;
    scanf("%d:%d:%d",&a,&b,&c);
    return a*3600+b*60+c;
}
int end()
{
    int a,b,c;
    scanf("%d:%d:%d",&a,&b,&c);
    char ch,extra_day;
    int tt=a*3600+b*60+c;
    while( (ch = getchar())!='\n' && ch != '\r' ) {
        if(ch == '(') {
            getchar();  //除去"+"
            extra_day = getchar();   //额外天数
            tt += (extra_day - '0')*24*60*60;
        }
    }
    return tt;
}

void solve()
{
    int st1,st2;
    int end1,end2;

    st1=sta();
    end1=end();
    st2=sta();
    end2=end();

    int sum1=(end1-st1)+(end2-st2);
    sum1/=2;
    int h=sum1/3600;
    sum1-=h*3600;
    int m=sum1/60;
    sum1-=m*60;
    int s=sum1;
    printf("%02d:%02d:%02d\n",h,m,s);
}
signed main(){
//    std::ios::sync_with_stdio(false);
//    std::cin.tie(nullptr);
    int T=1;
    cin>>T;
    while(T--){
        solve();
    }
    return 0;
}

 

posted @ 2024-04-02 17:07  whatdo+  阅读(6)  评论(0编辑  收藏  举报