Codeforces Round #620(Div.2)

30 篇文章 0 订阅

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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值