Codeforces Round #418 (Div. 2)-A. An abandoned sentiment from past-思维

来源:互联网 发布:深圳java程序员工资 编辑:程序博客网 时间:2024/06/08 13:37

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