链接:https://www.nowcoder.com/acm/contest/118/H
来源:牛客网
程序员的好印象
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
有一个程序员做过 n 个项目,他想要跳槽,因此他想要给面试官留下一个好印象。于是他想使自己看起来很有潜力也相应的会有竞争力,于是他决定从自己以前做过的N个成功或者失败的项目里不改变原来的时间顺序从中选择若干个项目,使得他展示出来的任意一个成功的项目之后都不会有一个失败的项目。这样一来,能够表现出他十足的潜力:尽管一开始做项目会失败,但一旦学会之后就不会再失败。具体的来说,给定一个含 n 个数字的“01”序列,如一个含5个数字的“01”序列:0 0 0 0 1,其中0代表失败的项目,1代表成功的项目。即第一个0代表第一个失败的项目,第二个0代表第二个失败的项目......最后一个1代表第五个成功的项目。于是如果这个程序员将选取一个原序列的一个子序列 0 0 0 0,满足上面他的要求:任意的数字1之后都没有数字0出现。程序员的目的是为了在满足上面的要求的条件下尽可能的展示最多的项目,请帮他算最多能展示多少个项目。
输入描述:
每组样例第一行为一个整数n,1<=n<=100,第二行为n项的01序列,每一项之间用一个空格隔开。
输出描述:
输出一个正整数,表示最多能展示的项目个数。
示例1
输入
4 1 1 0 1 6 0 1 0 0 1 0 1 0
输出
3 4 1
我用了暴力跑每一个1的,对于每一个1,长度为 1之前的0的个数加1之后1的个数
全零的情况也要考虑
#include<iostream> #include<cstring> #include<string> #include<cmath> #include <queue> #include<stack> #include<cstdio> #include<vector> #include<deque> #include<algorithm> #include<iomanip> #define inf 0x3f3f3f3f #define ll long long using namespace std; int a[105]; int main() { int n; while(cin>>n) { int s=0; for(int i=1;i<=n;i++) { cin>>a[i]; if(a[i]==0) s++; } for(int i=1;i<=n;i++) { if(a[i]==1) { int s0=0; int s1=0; for(int j=1;j<i;j++) { if(a[j]==0) s0++; } for(int j=i;j<=n;j++) { if(a[j]==1) { s1++; } } if(s1+s0>s) { s=s1+s0; } } } cout<<s<<endl; } return 0; }
结果发现就是求最长不降子序列
#include<iostream> #include<algorithm> #include<iomanip> #include<math.h> #include<string> #include<cstring> using namespace std; int main() { int i,j,n,a[101],dp[101],max=0; while(~scanf("%d",&n)) { int a[101]={0}; for(i=0;i<n;i++) { scanf("%d",&a[i]); dp[i]=1; } for(i=1;i<n;i++) { for(j=0;j<i;j++) { if(a[i]>=a[j]&&dp[j]+1>dp[i]) dp[i]=dp[j]+1; } } max=0; for(i=0;i<n;i++) { if(dp[i]>max) max=dp[i]; } printf("%d ",max); } }