Codeforces Round #335 (Div. 2)

Codeforces Round #335 (Div. 2)

A. Magic Spheres

题意:三种颜色的球,其中任意两个相同颜色的球能换成其他颜色的球。问,给出各个颜色的球的,能不能满足最后要求的相应颜色球的数量;

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a,b,c;
ll x,y,z;
int main()
{
    while(~scanf("%I64d%I64d%I64d",&a,&b,&c))
    {
        scanf("%I64d%I64d%I64d",&x,&y,&z);
        ll ans=0;
        ll sum=0;
        if(a-x>=0)
            ans+=(a-x)/2;
        else
            sum+=x-a;
        if(b-y>=0)
            ans+=(b-y)/2;
        else
            sum+=y-b;
        if(c-z>=0)
            ans+=(c-z)/2;
        else
            sum+=z-c;
        if(ans-sum >=0 )
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}

C. Sorting Railway Cars

题意:一列带编号的cars,每次可以把一个编号的车移到最前面或者最后面,求让这列cars以升序的方式排列,最小的移动方案。

这个和原来写的一道BC的题差不多,不过那个是只能放在末尾,直接让t=1 从开始一直搜下去,输出n-t就行了。这道题可以两边放,那样写明显就不对了。试了几组样例之后发现:不管是往前放还是往后放都是为了尽快的达到升序,而有些本来就是连续升序的cars就不用移动了,相对位置本身就是平衡的,所以只需要找出 最长连续上升子序列 的长度就行了(这里的 '连续' 是指 a[i]=a[i-1]+1),并且n^2是过不了的(dp方法没法写,n*logn的方法是 循环+二分搜索 ),不过这里有O(n)的方法。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t;
int a[100010];
int num[100010];
int main()
{
    while(~scanf("%d",&t))
    {
        for(int i=1; i<=t; i++)
        {
            scanf("%d",&a[i]);
            num[a[i]]=i;
        }
        int ans=1;
        int sum=1;
        for(int i=2; i<=t; i++)
        {
            if(num[i]-num[i-1]>0)
                sum++;
            else
            {
                sum=1;

            }
            ans=max(ans,sum);
            //cout <<ans <<endl;
        }
        cout << t-ans <<endl;
    }
    return 0;
}
posted @ 2015-12-10 04:41  zzuli_柚子  阅读(197)  评论(0编辑  收藏  举报