A.
题意:两只兔子各有初始位置,然后各有速度,然后相向跳跃
水题:俺一开始来了个循环L了一发!!!难过!
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
int main(){
int t;
cin>>t;
while(t--){
ll a,b;
ll x,y;
cin>>x>>y>>a>>b;
ll len = y - x;
int flag = 0;
int ans = len/(a+b);
if(ans * (a+b) == len){
flag = 1;
cout<<ans<<endl;
}
if(!flag){
cout<<-1<<endl;
}
}
return 0;
}
B.
题意:就是给多个字符串然后问是否能组成尽可能长的新的字符串使得新的字符串时回文串
思路:一开始想错了,以为能变动字符顺序,就把所有字符数统计然后偶数对输出…***!!!
要仔细审题,题目中的意思是就是字符串连接,看样例也行啊!
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
string s[105];
string ss[105];
string ans,mmp;
string flag;
map<string,int> st;
int main()
{
ios::sync_with_stdio(0);
int n, m;
cin>>n>>m;
ans = mmp = ""; //等于空串
for(int i=1;i<=n;i++)
cin >> s[i];
for(int i=1;i<=n;i++){
flag = s[i];
reverse(flag.begin(),flag.end());//将串反转
if (flag == s[i]){//如果自身时回文串,那么选择一个最大的放中间
if (flag.size() > mmp.size())
mmp = flag, ss[i] = "1";//对应位置搞个东西替代
}
else{
ss[i] = flag;//否则就把反转串放入字符串数组
}
}
for(int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (s[i] ==ss[j] && st[s[i]] == 0){//原来的串跟反转串相等
ans += s[i];//说明存在互为回文的两个串
flag = s[i];
st[flag] = 1;//置为1
reverse(flag.begin(), flag.end());
st[flag] = 1;//对应的另一个也要,好让不重复加
}
if(ans == "" && mmp == ""){
cout<<0<<endl;
}
else{
flag = ans;//得到另半个的串
reverse(flag.begin(), flag.end());
int len = ans.size()+mmp.size()+flag.size();
cout<<len<<endl;
cout<<ans<<mmp<<flag<<endl;
}
return 0;
}
C
题意:就是每个客人在不同的时间来到,有自己喜欢的不同的温度上限跟下限,然后每一分钟你能降一个温度或者升一个温度,求你能否满足所有人的要求,能输出YES,否则输出no
思路:就是每个客人都有一个自己的区间,那么我们动态更新在上一个客人后能达到的最高温度跟最低温,(客人按照来的先后顺序排序),然后看客人的区间是否在这个区间里面,不在那么就输出NO,然后break掉,否则我们要跟新当前的区间,最低温应该取当前客人的最低温跟上目前所能达到的最低温的最大值,(假如当前最低温是大于客人最低温的,那么由于不能达到客人最低温,所以就取大的了,反之你要满足客人需求,所以取客人的最低温)。那么另外的一个边界也是这样取得的
数据真水!客人顺序都自动从小到大…
#include<bits/stdc++.h>
#define maxn 205
using namespace std;
typedef long long ll;
ll t;
ll n,m;
struct node
{
ll t;
ll l;
ll h;
}a[maxn];
int cmpp(node x,node y){
return x.t < y.t;
}
int main(){
cin>>t;
while(t--)
{
cin>>n>>m;
ll minn=m;
ll maxx=m;
int flag=0;
a[0].t=0;
for(int i=1;i<=n;i++){
cin>>a[i].t>>a[i].l>>a[i].h;
}
sort(a+1,a+n+1,cmpp);
for(int i=1;i<=n;i++)
{
ll res=a[i].t-a[i-1].t;
ll temp1=minn-res;//下界
ll temp2=maxx+res;//上届
if(temp1>a[i].h || temp2<a[i].l){
flag = 1;
break;
}
minn = max(temp1,a[i].l);
maxx = min(temp2,a[i].h);
}
if(flag)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}
return 0;
}
D.题意:就是给你个>,<,找出在n里面满足这样的数的序列,并且分别打印最短递增跟最长递增。
思路:跟这题意乱写一通,过了…c
总感觉不对就没敢交…
明天补思路,困…
#include <bits/stdc++.h>
using namespace std;
string s;
int n,t;
void Codeforce()
{
scanf("%d",&n);
cin >> s;
int total = 0, ans = n;
for(int i=0;i<=n-2;i++){
if (s[i] == '<')
total++;
else{
for(int i=ans-total;i<=ans;i++)
cout << i << " ";
ans = ans - total - 1;
total = 0;
}
}
for (int i = ans - total ; i <= ans && i >= 1 ; i ++)
cout << i << " ";
cout << '\n';
total = 0;
ans = 1;
for(int i=0;i<=n-2;i++){
if (s[i] == '>')
total++;
if (s[i] == '<'){
for(int i=ans+total;i>=ans;i--)
cout << i << " ";
ans = ans + total + 1;
total = 0;
}
}
for (int i = ans + total; i >= ans && i <= n; i--)
cout << i << " ";
puts("");
}
int main()
{
scanf("%d",&t);
while (t--)
{
Codeforce();
}
return 0;
}