标签:str 顺序 数组 space 中间 editable ring fine 比较
3 1 2 3 3 5 1 2
9 15
题目解析:
本道题其实就是就是找 1,并分情况处理 1,看将其加到它的前边某个数上或它的下一个数上。
示例代码:
1 #include<stdio.h> 2 #include<string.h> 3 using namespace std; 4 5 #define MAX_NUM 10001 6 7 int num[MAX_NUM]; //保存输入的数 8 int mark[MAX_NUM]; //标记,当不需要计算时,置-1 9 10 int main() 11 { 12 int n; 13 while (scanf("%d", &n) != EOF) 14 { 15 for (int i = 0; i < n; i++) 16 scanf("%d", &num[i]); 17 memset(mark, 0, sizeof(num)); 18 19 if (num[0] == 1) //如果第一个数为1 20 { 21 num[1] += 1; //则将它加到第二个数上 22 mark[0] = -1; //将标记置-1,计算时就不需要算它 23 } 24 if (num[n-1] == 1) //如果最后一个数为1 25 { 26 num[n-2] += 1; //那么将它加到倒数倒数第二个数上 27 mark[n-1] = -1; 28 } 29 30 int tmp; 31 for (int i = 1;i < n-1; i++) //中间的数 32 { 33 if (num[i] == 1) //如果找到第i个数为1 34 { 35 mark[i] = -1; //先将标记置-1 36 tmp = i-1; //先准备将它加到它前一个数上 37 38 while(mark[tmp] == -1) { //如果它的前一个为1,且已经处理过了 39 tmp--; //那么继续往前找 40 } 41 42 if (num[tmp] <= num[i+1] || num[tmp] == 2) //利用贪心思想考虑将这个1加到它的前边还是后边 43 //(1)如果找到它的前边那个不为1的数,且小于等于它的下一个数 或 44 //(2)它的前边那个不为1的数为2,则加到前边那个不为1的数上边 45 num[tmp]++; 46 else//否则加到它的下一个数上 47 num[i+1]++; 48 } 49 } 50 51 int ans = 1; 52 for (int i = 0; i < n; i++) 53 { 54 if (mark[i] != -1) //将标记数组中不为-1的数相乘即为最大的数 55 ans = ans * (num[i]) % 10086; 56 } 57 printf("%d\n", ans); 58 } 59 60 }
标签:str 顺序 数组 space 中间 editable ring fine 比较
原文地址:http://www.cnblogs.com/cao-lei/p/7222378.html