http://codeforces.com/contest/814/problem/A
给定你两个数组,让第二个数组中的数可以替换掉第一个串中的0,问你是否可以使a串不是递增的,如果可以输出YES,否则输出NO
我的做法是暴力。只考虑最差的情况,把b数组排序后,从大到小填入a数组,然后判断最长递增子序列是不是a的长度。。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <bits/stdc++.h>
using namespace std;
const int maxn=2000;
int main()
{
int a[maxn],m;
int b[maxn],n;
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++){
scanf("%d",&b[i]);
}
sort(b+1,b+n+1);
int j=n;
for(int i=1;i<=m;i++){
if(a[i]==0){
a[i]=b[j--];
}
}
vector<int>q;
for(int i=1;i<=m;i++){
int l=lower_bound(q.begin(),q.end(),a[i])-q.begin();//因为是非递减,所以用lower
if(l==q.size())
q.push_back(a[i]);
else
q[l]=a[i];
}
if(q.size()!=m)
puts("YES");
else
puts("NO");
/*cout<<q.size()<<endl;
for(int i=0;i<q.size();i++){
cout<<q[i]<<endl;
}*/
return 0;
}
方法2就好多了。
当m大于1时肯定是yes的。。。(有很多种顺序)
当为1时判断就行,。。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[201],b[201];
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(int j=1;j<=m;j++)
{
scanf("%d",&b[j]);
}
if(m>1)
{
printf("Yes\n");
}
if(m==1)
{
for(int i=1;i<=n;i++)
{
if(a[i]==0)
a[i]=b[1];
}
int t=1;
for(int i=1;i<n;i++)
{
if(a[i]<a[i+1])
continue;
else
{
t=0;
break;
}
}
if(t==1)
printf("No\n");
else
printf("Yes\n");
}
return 0;
}