Codeforces Round #620 (Div. 2)

QAQ

A. Two Rabbits

题意:

有两只兔子,距离为n,左边兔子每秒向右跳a,右边兔子每秒向左跳b,问两只兔子何时能相遇,如果不能相遇输出-1

思路:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn =1e3+10;
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        LL x,y,a,b;
        cin >> x >> y >> a>> b;
        if((y-x)%(a+b)!=0)
            printf("-1\n");
        else
            cout << (y-x)/(a+b)<< "\n";
    }
    return 0;
}

 

简单题,直接模拟即可,详细见代码。

代码:

B. Longest Palindrome

题意:

给你n个等长的字符串,求由这n个字符串构成的最长的镜像串

思路:

如果有两个是对称的那一定要加上,如果可能的话在中间再放上一个本身是镜像串的串

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn =1e3+10;
map<string,int>mp;
string s[105];
bool vis[105];
bool check(string sp,int len)
{
    for(int i = 0,j=len-1;i<=j;++i,--j)
    {
        if(sp[i]!=sp[j])
        {
            return false;
        }
    }
    return true;
}
bool isP[105];
int main()
{
    memset(vis,false,sizeof(vis));
    memset(isP,false,sizeof(isP));
    int n,m;
    scanf("%d %d",&n,&m);
    for(int i  = 0;i<n;++i)
    {
        cin >> s[i];
        mp[s[i]] = i;
        if(check(s[i],m))
            isP[i] = true;
    }
    string ans;
    for(int i = 0;i<n;++i)
    {
        if(vis[i])
            continue;
        //vis[i] = true;
        string tmp = s[i];
        reverse(tmp.begin(),tmp.end());
        if(mp.find(tmp)!=mp.end()&&!vis[mp[tmp]]&&mp[tmp]!=i)
        {
            vis[i] = 1;
            ans+=s[i];
            vis[mp[tmp]] = 1;
        }
    }
    string tmp = ans;
    for(int i = 0;i<n;++i)
    {
        if(!vis[i]&&isP[i])
        {
            ans+=s[i];
            break;
        }
    }
    reverse(tmp.begin(),tmp.end());
    ans+=tmp;
    printf("%d\n",ans.size());
    cout << ans << "\n";
    return 0;
}

 

C. Air Conditioner

题意:

有个人开了一家餐馆,餐馆有一个空调,空调每秒钟有三个状态,升温,不变,降温,接下来有n个到来,对于每个顾客,给出他到来的时间,所能接受的温度下限,所能接受的温度上限,给出餐馆的起始温度,问能否通过调节使的每个顾客到来时温度都能使他满意。

思路:

假设现在的温度为m,它过了t秒以后所能到达的温度范围是[m-t,m+t],把这个范围与在第t秒到的顾客所能接受的温度范围取个交集,若交集为空就证明无论如何调节,都不能满足该顾客的需求。反之,一直往下去取交集即可。

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
struct CU
{
    LL t,l,h;
    bool operator<(const CU&b)const
    {
        return t<b.t;
    }
}C[105];int n;
        LL m;
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {

        scanf("%d %lld",&n,&m);
        for(int i = 1;i<=n;++i)
        {
            scanf("%lld %lld %lld",&C[i].t,&C[i].l,&C[i].h);
        }
        LL t = 0;
        LL mx = m,mi = m;
        bool flag = true;
        for(int i = 1;i<=n;++i)
        {
            mx+=C[i].t-t;
            mi-=C[i].t-t;
            t = C[i].t;
            if(!(mx<C[i].l||mi>C[i].h))
            {
                    mi = max(mi,C[i].l);
                    mx = min(mx,C[i].h);
            }
            else
            {
                flag = false;
                break;
            }
           // cout << mi << " "<< mx <<"\n";
        }
        if(flag)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

D. Shortest and Longest LIS

题意:

给你一个n以及一个表示相邻两数之间大小关系的字符串,让你求两个1-n的且满足前面大小关系的排列,一个具有最短的LIS,一个又最大的LIS。输出这两个排列。

思路:

dilworth定理原理我也不太懂QAQ

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 2e5+100;
int a[maxn],b[maxn];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n;
        string s;
        cin >> n >> s;
        for(int i = 0;i<n;++i)
        {
            a[i] = i+1;
            b[i] = n-i;
        }
        for(int i  = 0;i<n-1;++i)
        {//cout << i<< endl;
            if(s[i]=='<'&&a[i]<a[i+1]||s[i]=='>'&&a[i]>a[i+1])
                continue;
            else
            {
                bool flag = false;
                int j = 0;
                for( j = i+1;j<n-1;++j)
                {
                    if(s[j]=='<'&&a[j]<a[j+1]||s[j]=='>'&&a[j]>a[j+1])
                        {
                            flag = true;
                            break;
                        }

                }
                    for(int l = i,r=j;l<=r;++l,--r)
                        swap(a[l],a[r]);
                i = j;
            }

        }
        for(int i  = 0;i<n-1;++i)
        {
            if(s[i]=='<'&&b[i]<b[i+1]||s[i]=='>'&&b[i]>b[i+1])
                continue;
            else
            {
                bool flag = false;
                int j = 0;
                for( j = i+1;j<n-1;++j)
                {
                    if(s[j]=='<'&&b[j]<b[j+1]||s[j]=='>'&&b[j]>b[j+1])
                        {
                            flag = true;
                            break;
                        }

                }
               // cout << i << " "<< j << endl;
                    for(int l = i,r=j;l<=r;++l,--r)
                        swap(b[l],b[r]);
                    i = j;
            }
        }
        printf("%d",b[0]);
        for(int i = 1;i<n;++i)
            printf(" %d",b[i]);
        printf("\n");
        printf("%d",a[0]);
        for(int i = 1;i<n;++i)
            printf(" %d",a[i]);
        printf("\n");
    }
    return 0;
}
posted @ 2020-03-09 22:25  浅花迷人  阅读(157)  评论(0编辑  收藏  举报