nyoj1170 最大的数

来源:互联网 发布:显示器屏幕测试软件 编辑:程序博客网 时间:2024/05/29 10:37

是一道贪心的题目,一开始用区间dp做了一遍,竟然超内存了。。。不过就算不超内存肯定也会超时。

题解:

当该数不是1的话肯定是相乘最大,所以就找1处理就好,处理之后该位要变成0。

当1在首尾的时候要特殊判断,找到和它最近的数加起来。

当在其他位置的时候,和最小的数相加,若这里要注意2要特殊判断,一个样例:2 1 1 2,这里第一个1就要加到2上,而不是第三位的1。


#include<iostream>#include<stdio.h>#include<math.h>#include<string.h>#include<vector>#include<list>#include<algorithm>using namespace std;int a[10010];void add(int l,int r);int main(){int n;while(scanf("%d",&n)!=EOF){for(int i=0;i<n;i++){scanf("%d",&a[i]);}for(int i=0;i<n;i++){if(a[i]==1){if(i==0){if(i+1<n){a[i+1]++;a[i] = 0;}}else if(i==n-1){for(int j=i-1;j>=0;j--){if(a[j]){a[j]++;a[i] = 0;break;}}}else{add(i-1,i+1);}}}int ans = 1;for(int i=0;i<n;i++){if(a[i]) ans = ans * a[i] %10086;}printf("%d\n",ans);} return 0;}void add(int l,int r){while(a[l]==0)l--;if(a[l]==2){a[l]++;a[r-1] = 0;}else{a[l]>a[r]?a[r]++:a[l]++;a[r-1] = 0;}}


0 0
原创粉丝点击