A题:
题意:两只兔子,大兔子在位置X,每单位时间跳N格,小兔子在位置Y,每单位时间跳M格,兔子在左,小兔子在右,面对面跳,输出相遇的时间,如果无法相遇,输出-1。
思路:这道题的话,直接看(y-x)能否被(a+b)整除即可。
AC代码:
#include <bits/stdc++.h>
typedef long long ll;
const int maxx=10010;
const int inf=0x3f3f3f3f;
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ll x,y,a,b;
scanf("%lld%lld%lld%lld",&x,&y,&a,&b);
if((y-x)%(a+b)==0)
printf("%lld\n",(y-x)/(a+b));
else
printf("-1\n");
}
return 0;
}
B题:
题意:给了n和m,代表n个长度为m的字符串,保证字符串不相同,问能拼接出的最长字符串的长度和字符串内容。
思路:这道题的话,n比较小可以n方枚举两个串是否镜像对称,然后看有没有中心对称的串可以放在中间。
AC代码:
#include <bits/stdc++.h>
typedef long long ll;
const int maxx=10010;
const int inf=0x3f3f3f3f;
using namespace std;
string s[110];
bool vis[110];
int main()
{
int n,m;
cin>>n>>m;
for(int i=0; i<n; i++)
cin>>s[i];
vector<pair<int,int> >v;
for(int i=0; i<n; i++)
{
for(int j=i+1; j<n; j++)
{
reverse(s[j].begin(),s[j].end());//reverse()函数可以对字符串进行反转操作,头文件是#include<algorithm>容器类型的要用begin()和end()来指定反转的区域,数组类型的直接用int类型即可
if(s[i]==s[j])
{
v.push_back(make_pair(i,j));
}
reverse(s[j].begin(),s[j].end());
}
}
string ans="";
for(int i=0; i<n; i++)
{
string cnt=s[i];
reverse(s[i].begin(),s[i].end());
if(s[i]==cnt)
{
ans+=cnt;
break;
}
reverse(s[i].begin(),s[i].end());
}
for(int i=0; i<v.size(); i++)
{
int a=v[i].first;
int b=v[i].second;
ans=s[a]+ans+s[b];
}
cout<<ans.length()<<endl;
cout<<ans<<endl;
return 0;
}
C题:
题意:给了初始的温度和客人个数,客人按照时间顺序来到店里,要求客人到店时的温度在一段区间范围之内,问能否满足所有人的需求。
思路:这道题的话,先对顾客到店的时间进行排序,之后对于每一个顾客判断[li,hi]与[li-ti,hi+ti]是否有交集即可。
AC代码:
#include <bits/stdc++.h>
typedef long long ll;
const int maxx=10010;
const int inf=0x3f3f3f3f;
using namespace std;
struct node
{
int ti;
int li;
int hi;
} edge[maxx];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m;
cin>>n>>m;
int flag=1;
int now=0;
int lh=m,ld=m;
for(int i=0; i<n; i++)
{
cin>>edge[i].ti>>edge[i].li>>edge[i].hi;
lh=lh+(edge[i].ti-now);
ld=ld-(edge[i].ti-now);
if(lh<edge[i].li || ld>edge[i].hi)
flag=0;
else
{
lh=min(lh,edge[i].hi);
ld=max(ld,edge[i].li);
}
now=edge[i].ti;
}
if(flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}
D题:
题意:给一串大于号和小于号,要求构造满足大小关系的从1到n的n个数的排列,构造一组最长上升子序列长度最短的,一组最长的。
思路:这道题的话,贪心,最短序列的话,对于一串大于号,我们把当前未使用过的数尽可能的放在左边,最长序列就是反过来,尽可能的放未使用过的小的数即可。
AC代码:
#include <bits/stdc++.h>
typedef long long ll;
const int maxx=200010;
const int inf=0x3f3f3f3f;
using namespace std;
int a[maxx];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
string s;
cin>>n>>s;
int num=n,ans=0;
for(int i=0; i<n; i++)
{
if(s[i]=='>' || i==n-1)
{
for(int j=i; j>=ans; j--)
a[j]=num--;
ans=i+1;
}
}
for(int i=0; i<n; i++)
cout<<a[i]<<" ";
cout<<endl;
num=1,ans=0;
for(int i=0; i<n; i++)
{
if(s[i]=='<' || i==n-1)
{
for(int j=i; j>=ans; j--)
a[j]=num++;
ans=i+1;
}
}
for(int i=0; i<n; i++)
cout<<a[i]<<" ";
cout<<endl;
}
return 0;
}