蓝桥杯训练赛
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; }