Codeforces Round #620 (Div. 2)

http://codeforces.com/contest/1304

这把心态爆炸哈哈,B题把心思搞得很乱,写着写着受不了就关机了。以后不能这样了,一个普通比赛心态就这么差,谈何比赛?

A. Two Rabbits

    题意:倆兔子,坐标轴上一只往左一只往右,给出初始坐标和速度问是否能在同一时间相遇。

    

#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        ll x,y,a,b;
        cin>>x>>y>>a>>b;
        if((y-x)%(a+b)==0)
            cout<<(y-x)/(a+b)<<endl;
        else
            cout<<"-1"<<endl;
    }
}

B. Longest Palindrome

    题意:在给出的字符串中(不存在重复)组出一个最长回文串出来,存在就输出其长度和结果,否则就是"0"。

     解析:由于不存在重复串,所以把互为回文的串放两边,纯回文的放中间。我这里使用string l , mid ;L来记录互为回文的左边,mid记录本身为回文的串。为什么我没有用r来记录右边呢?因为这里存在一个输出顺序的问题,不能简单相加,是个先进后出的情况。所以我用了vis数组来记录输出部分右边的坐标,最后再倒着输出就好了!

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=105;
int vis[maxn];
struct node
{
    string s;
}st[maxn];
int main()
{
    int n,m;
    cin>>n>>m;
    string s;
    for(int i=0;i<n;i++)
    {
        cin>>st[i].s;
    }
    int tot=0;
    string l,mid,r;
    for(int i=0;i<n;i++)
    {
        for(int j=i+1;j<n;j++)
        {
            string ch;
            for(int k=m-1;k>=0;k--)
            {
                ch+=st[j].s[k];
            }
            if(ch==st[i].s)
            {
                l+=st[i].s;
                vis[tot++]=j;
                break;
            }
        }
    }
    for(int i=0;i<n;i++)
    {
        int k=0;
        for(int j=0;j<m;j++)
        {
            if(st[i].s[j]!=st[i].s[m-1-j])
            {
                k=1;break;
            }
        }
        if(!k)
        {
            mid+=st[i].s;
            break;
        }
    }
    string all=l+mid;
    if(all.length()==0)
        cout<<"0"<<endl;
    else
        {
            cout<<all.length()+tot*m<<endl;
            cout<<l<<mid;
            for(int i=tot-1;i>=0;i--)
                cout<<st[vis[i]].s;
            cout<<endl;
        }
}

C. Air Conditioner

    题意:给出客人数量和初始温度,然后是每个客人到场时间和客人喜欢的温度界限。空调可以每分钟升1°或者降1°或者恒温。问是否能通过调节温度来满足每个客人?YES:NO

    解析:对于这种题,调节温度的过程具体我们是无法得知的,但是根据客人喜欢的温度界限,可以受此启发,我们也设定一个随时间不断变化的温度界限,如果客人的区间不超出它,就可以满足这个客人,否则就是NO。比如初始温度l=0,r=0,下个客人5分钟到场,那么我们的温度变化范围为[-5,5],如果客人满意区间和它有交集,就可以,否则直接输出NO

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        ll n,m;
        cin>>n>>m;
        ll t,a,b;
        ll l=m,r=m;
        ll time=0;
        int ok=0;
        for(int i=0;i<n;i++)
        {
            cin>>t>>a>>b;
            l=l-(t-time);
            r=r+(t-time);
            if(r<a||b<l)
            {
                ok=1;
            }
            else
            {
                l=max(l,a);
                r=min(b,r);                
            }    
            time=t;        
        }
        //cout<<"?"<<endl;
        if(ok)
            cout<<"NO"<<endl;
        else
            cout<<"YES"<<endl;
    }
    
}

 

posted @ 2020-03-16 15:59  liyexin  阅读(78)  评论(0编辑  收藏  举报