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