QAQ:
A. Two Rabbits
题意:
有两只兔子,距离为n,左边兔子每秒向右跳a,右边兔子每秒向左跳b,问两只兔子何时能相遇,如果不能相遇输出-1。
思路:
#include <bits/stdc++.h> using namespace std; typedef long long LL; const int maxn =1e3+10; int main() { int T; scanf("%d",&T); while(T--) { LL x,y,a,b; cin >> x >> y >> a>> b; if((y-x)%(a+b)!=0) printf("-1 "); else cout << (y-x)/(a+b)<< " "; } return 0; }
简单题,直接模拟即可,详细见代码。
代码:
B. Longest Palindrome
题意:
给你n个等长的字符串,求由这n个字符串构成的最长的镜像串
思路:
如果有两个是对称的那一定要加上,如果可能的话在中间再放上一个本身是镜像串的串
代码:
#include <bits/stdc++.h> using namespace std; typedef long long LL; const int maxn =1e3+10; map<string,int>mp; string s[105]; bool vis[105]; bool check(string sp,int len) { for(int i = 0,j=len-1;i<=j;++i,--j) { if(sp[i]!=sp[j]) { return false; } } return true; } bool isP[105]; int main() { memset(vis,false,sizeof(vis)); memset(isP,false,sizeof(isP)); int n,m; scanf("%d %d",&n,&m); for(int i = 0;i<n;++i) { cin >> s[i]; mp[s[i]] = i; if(check(s[i],m)) isP[i] = true; } string ans; for(int i = 0;i<n;++i) { if(vis[i]) continue; //vis[i] = true; string tmp = s[i]; reverse(tmp.begin(),tmp.end()); if(mp.find(tmp)!=mp.end()&&!vis[mp[tmp]]&&mp[tmp]!=i) { vis[i] = 1; ans+=s[i]; vis[mp[tmp]] = 1; } } string tmp = ans; for(int i = 0;i<n;++i) { if(!vis[i]&&isP[i]) { ans+=s[i]; break; } } reverse(tmp.begin(),tmp.end()); ans+=tmp; printf("%d ",ans.size()); cout << ans << " "; return 0; }
C. Air Conditioner
题意:
有个人开了一家餐馆,餐馆有一个空调,空调每秒钟有三个状态,升温,不变,降温,接下来有n个到来,对于每个顾客,给出他到来的时间,所能接受的温度下限,所能接受的温度上限,给出餐馆的起始温度,问能否通过调节使的每个顾客到来时温度都能使他满意。
思路:
假设现在的温度为m,它过了t秒以后所能到达的温度范围是[m-t,m+t],把这个范围与在第t秒到的顾客所能接受的温度范围取个交集,若交集为空就证明无论如何调节,都不能满足该顾客的需求。反之,一直往下去取交集即可。
代码:
#include <bits/stdc++.h> using namespace std; typedef long long LL; struct CU { LL t,l,h; bool operator<(const CU&b)const { return t<b.t; } }C[105];int n; LL m; int main() { int T; scanf("%d",&T); while(T--) { scanf("%d %lld",&n,&m); for(int i = 1;i<=n;++i) { scanf("%lld %lld %lld",&C[i].t,&C[i].l,&C[i].h); } LL t = 0; LL mx = m,mi = m; bool flag = true; for(int i = 1;i<=n;++i) { mx+=C[i].t-t; mi-=C[i].t-t; t = C[i].t; if(!(mx<C[i].l||mi>C[i].h)) { mi = max(mi,C[i].l); mx = min(mx,C[i].h); } else { flag = false; break; } // cout << mi << " "<< mx <<" "; } if(flag) printf("YES "); else printf("NO "); } return 0; }
D. Shortest and Longest LIS
题意:
给你一个n以及一个表示相邻两数之间大小关系的字符串,让你求两个1-n的且满足前面大小关系的排列,一个具有最短的LIS,一个又最大的LIS。输出这两个排列。
思路:
dilworth定理,原理我也不太懂QAQ
代码:
#include <bits/stdc++.h> using namespace std; typedef long long LL; const int maxn = 2e5+100; int a[maxn],b[maxn]; int main() { int T; scanf("%d",&T); while(T--) { int n; string s; cin >> n >> s; for(int i = 0;i<n;++i) { a[i] = i+1; b[i] = n-i; } for(int i = 0;i<n-1;++i) {//cout << i<< endl; if(s[i]=='<'&&a[i]<a[i+1]||s[i]=='>'&&a[i]>a[i+1]) continue; else { bool flag = false; int j = 0; for( j = i+1;j<n-1;++j) { if(s[j]=='<'&&a[j]<a[j+1]||s[j]=='>'&&a[j]>a[j+1]) { flag = true; break; } } for(int l = i,r=j;l<=r;++l,--r) swap(a[l],a[r]); i = j; } } for(int i = 0;i<n-1;++i) { if(s[i]=='<'&&b[i]<b[i+1]||s[i]=='>'&&b[i]>b[i+1]) continue; else { bool flag = false; int j = 0; for( j = i+1;j<n-1;++j) { if(s[j]=='<'&&b[j]<b[j+1]||s[j]=='>'&&b[j]>b[j+1]) { flag = true; break; } } // cout << i << " "<< j << endl; for(int l = i,r=j;l<=r;++l,--r) swap(b[l],b[r]); i = j; } } printf("%d",b[0]); for(int i = 1;i<n;++i) printf(" %d",b[i]); printf(" "); printf("%d",a[0]); for(int i = 1;i<n;++i) printf(" %d",a[i]); printf(" "); } return 0; }