A
題意:兩隻兔子面對面跳,一隻一次跳a,另一隻一次跳b問是否可能同時到達一個點
題解:判斷兩人之間的距離能否整除a+b即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
ll read(){
ll f=1,x=0;char ch;
do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
return f*x;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
int x,y,a,b;
scanf("%d%d%d%d",&x,&y,&a,&b);
if(abs(x-y)%(a+b)==0)printf("%d\n",abs(x-y)/(a+b));
else puts("-1");
}
return 0;
}
B
題意:給出n個長度爲m的字符串,可以重新串聯其中任意字符串,問能串出來的最長迴文串是什麼
題解:如果一個串本身是迴文串,那麼他就是我們新串的中間元素,那麼只需要check對於一個字符串,他的相反串在不在給出的n個串中即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
ll read(){
ll f=1,x=0;char ch;
do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
return f*x;
}
int n,m,cnt=1,vis[110];
string s[110],ans[110];
map<string,int>mp;
bool check(string s){
int len=s.length();
for(int i=0;i<len;i++)
if(s[i]==s[len-1-i])continue;
else return false;
return true;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
cin>>s[i] ;
mp[s[i]]=i;
}
for(int i=1;i<=n;i++){
if(check(s[i])){
ans[50]=s[i];
}else{
string a=s[i];
reverse(a.begin(),a.end());
if(mp.count(a) && !vis[mp[a]]){
ans[cnt]=s[i];
ans[100-cnt+1]=a;
cnt++;
vis[mp[a]]=1;
vis[i]=1;
}
}
}
int sum=0;
string anss;
for(int i=1;i<=100;i++)
if(ans[i][0]!='\0')sum+=m,anss=anss+ans[i];
printf("%d\n",sum);
cout<<anss<<endl;
return 0;
}
C
題意:有一臺空調,一分鐘能制熱一攝氏度或製冷一攝氏度或使溫度不變。每個ti時刻會進來一個人,他的舒適溫度是,問能否使所有顧客舒適。
題解:維護一個區間,每次進一個客人,他的可到達區間就是,判斷這個區間和客人的舒適溫度區間是否一直相交即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
ll read(){
ll f=1,x=0;char ch;
do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
return f*x;
}
int n,m;
int main(){
int T;
scanf("%d",&T);
while(T--){
int flag=0;
scanf("%d%d",&n,&m);
int l=m,r=m,la=0;
for(int i=1;i<=n;i++){
int t,le,ri;
scanf("%d%d%d",&t,&le,&ri);
l=l-(t-la),r=r+(t-la);
if(l>ri)flag=1;
if(r<le)flag=1;
l=max(l,le);r=min(r,ri);la=t;
}
if(flag)puts("NO");
else puts("YES");
}
return 0;
}
D
題意:給出n個數和n-1個大小關係,問能否構造出最少的LIS和最多的LIS(LIS 最長上升子序列)
題解:貪心,對於最少的LIS就是原數組儘量將大的數字放在前面。對於最多的LIS就是儘量將最小的數字放在前面
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
ll read(){
ll f=1,x=0;char ch;
do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
return f*x;
}
int n,a[maxn];
char s[maxn];
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%s",&n,s+1);
for(int i=1;i<=n;i++)a[i]=n-i+1;
for(int i=1;i<n;){
int j=i;
while(s[j]=='<')j++;
reverse(a+i,a+j+1);
i=j+1;
}
for(int i=1;i<n;i++)printf("%d ",a[i]);printf("%d\n",a[n]);
for(int i=1;i<=n;i++)a[i]=i;
for(int i=1;i<n;){
int j=i;
while(s[j]=='>')j++;
reverse(a+i,a+j+1);
i=j+1;
}
for(int i=1;i<n;i++)printf("%d ",a[i]);printf("%d\n",a[n]);
}
return 0;
}