A. Three swimmers
题意
有三个人再泳池左边,游泳一圈需要时间a,b,c,你在p分钟到泳池左边,你需要等几分钟才能有人到泳池左边?
题解
签到题,直接算就行了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define imax 0x3f3f3f3f
#define lmax 0x3f3f3f3f3f3f3f3f
ll max(ll a, ll b) {
if (a > b) return a;
return b;
}
ll min(ll a, ll b) {
if (a < b) return a;
return b;
}
int main(void)
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int _;
cin>>_;
while(_--){
ll p,a,b,c;
cin>>p>>a>>b>>c;
ll a1,b1,c1;
if(p%a==0||p%b==0||p%c==0){
cout<<0<<endl;
continue;
}
else{
a1=p/a+1;
b1=p/b+1;
c1=p/c+1;
cout<<min(a*a1-p,min(b*b1-p,c*c1-p))<<endl;
}
}
return 0;
}
B. Card Deck
题意
有n张卡片,你每次可以从顶部取任意张(顺序不变)放在新一堆卡片的顶部,求取得最大价值的顺序。
题解
我们每次都让未取卡片中的最大值在前面,这样就能保证计算得到的价值最大。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define imax 0x3f3f3f3f
#define lmax 0x3f3f3f3f3f3f3f3f
int main(void)
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int _;
cin>>_;
while(_--){
int n;
cin>>n;
int num[n];
set<int> s;
for(int i=0;i<n;i++){
cin>>num[i];
s.insert(num[i]);
}
int b=n-1;
while(s.size()!=0){
int m=*(s.rbegin());
int i;
for(i=b;i>=0;i--){
if(num[i]==m) break;
}
int swa=i-1;
for(;i<=b;i++){
cout<<num[i]<<" ";
s.erase(num[i]);
}
b=swa;
}
cout<<endl;
}
return 0;
}
C. Maximum width
题意
给出两个长度分别为n、m字符串s、t,从s中按顺序找出m个字符组成t,使得其中两个相邻的字符下标之差最大。
题解
首先在s中找到t[0]和t[m-1]所在的位置,作为查找的起始点和终点。然后找出在s中从起始点按顺序找到剩余t中的字符的下标,再从终点倒序找出剩余t中的字符的下标,之后两两相减,取最大值。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define imax 0x3f3f3f3f
#define lmax 0x3f3f3f3f3f3f3f3f
int main(void)
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int n,m;
cin>>n>>m;
string s,t;
cin>>s;
cin>>t;
int l,r;
for(int i=0;i<n;i++){
if(s[i]==t[0]) {
l=i;
break;
}
}
for(int i=n-1;i>=0;i--){
if(s[i]==t[m-1]) {
r=i;
break;
}
}
if(m==2){
cout<<r-l<<endl;
return 0;
}
int j=m-2,num[m],num2[m];
num2[0]=l;
num[m-1]=r;
for(int i=r-1;i>=0;i--){
if(s[i]==t[j]){
num[j]=i;
j--;
if(j==0) break;
}
}
j=1;
for(int i=l+1;i<n;i++){
if(s[i]==t[j]){
num2[j]=i;
j++;
if(j==m-1) break;
}
}
//for(int i=0;i<m;i++)cout<<num[i]<<" ";
// cout<<endl;
//for(int i=0;i<m;i++)cout<<num2[i]<<" ";
//cout<<endl;
int ma=0;
for(int i=0;i<m-1;i++){
ma=max(num[i+1]-num2[i],ma);
}
cout<<ma<<endl;
return 0;
}