最大的数(nyoj 1170)

最大的数

时间限制:1000 ms  |  内存限制:65535 KB

难度:3

描述

小明和小红在打赌说自己数学学的好,于是小花就给他们出题了,考考他们谁NB,题目是这样的给你N个数

在这n个数之间添加N-1个*或+,使结果最大,请得出这个结果

1 3 5

结果是(1+3)*5=20;最大

可以添加若干个括号,但一定要保证配对,但是每两个数之间只可能有一个*或+

数列最前和最后不应有+或乘

小明想赢小红但是他比较笨,请你帮帮他

输入
多组测试数据以EOF结束,每组有一个n(n<10000),然后有n个正整数a[i](1<=a[i]<=20)
输出
输出最大的结果由于结果比较大,结果对10086取余
样例输入
3
1 2 3
3
5 1 2
样例输出
9
15
来源
calamity_coming
上传者
ACM_孙毓阳

syy出的非常好的贪心题

思路是这样的

遇到1就相加 (得考虑左边加还是右边加的情况,优先考虑左边)

1 1 1 1的情况

0 2 1 1

0 2 0 2  2*2=4

3 2 0 0 1//找到左边不为0的数+1

3 3 0 0 1

4 1 4 1//为什么要优先左边

#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdio.h>
using namespace std;
int a[10005];
void add(int l,int r)
{
    if(a[l]==2)
    {
        a[l]++;
        return ;
    }
    if(a[l]==0)
        l--;
    a[l]<=a[r]?a[l]++:a[r]++;
}
int main()
{
    int n;
    while(cin>>n)
    {
        int i,j;
        for(i=0; i<n; i++)
            cin>>a[i];
        if(a[0]==1)
        {
            a[1]++;
            a[0]=0;
        }
        for(i=1; i<n-1; i++)
            if(a[i]==1)
            {
                a[i]=0;
                add(i-1,i+1);//左加or右加
            }
        if(a[n-1]==1&&n>1)
        {
            for(i=n-2; !a[i]; i--);//0
            a[i]++;
            a[n-1]=0;
        }
        int sum;
        for(i=0,sum=1; i<n; i++)
            if(a[i])
                sum=(sum*a[i])%10086;
        cout<<sum<<endl;
    }
}
        
时间: 2024-12-19 11:28:58

最大的数(nyoj 1170)的相关文章

NYOJ 1170 最大的数

描述 小明和小红在打赌说自己数学学的好,于是小花就给他们出题了,考考他们谁NB,题目是这样的给你N个数 在这n个数之间添加N-1个*或+,使结果最大,但不可以打乱原顺序,请得出这个结果 如 1 3 5 结果是(1+3)*5=20:最大 可以添加若干个括号,但一定要保证配对,但是每两个数之间只可能有一个*或+ 数列最前和最后不应有+或乘 小明想赢小红但是他比较笨,请你帮帮他 输入 多组测试数据以EOF结束,每组有一个n(n<10000),然后有n个正整数a[i](1<=a[i]<=20)

高数 NYOJ 1043

1 #include<stdio.h>//高数(1043) 2 #include<math.h> 3 double f(double n) 4 { 5 double t; 6 if(n>=0&&n<=2)t=4.0/3*pow(n,1.5)-0.4*pow(n,2.5); 7 else if(n>2&&n<=5)t=f(2)+0.25*pow(n,4)-2.0/3*pow(n,3)-0.5*pow(n,2)+2*n-6+16.

nyoj 数的二进制中1的个数

很有用O(n)内实现三类数字分离,以前大多是分成两类数据,快排中分成两类,还有就是"ab***vvvc" 在O(n)中变成 abvvc****,变成两类划分问题 #include<iostream> #include<string.h> using namespace std; const int N=1000; char c[N]; int len; void swap(char &a,char &b) { //a=a^b; //b=a^b;

nyoj 数数

/*数数时间限制:3000 ms  |  内存限制:65535 KB 难度:2描述 我们平时数数都是喜欢从左向右数的,但是我们的小白同学最近听说德国人数数和我们有些不同,他们正好和我们相反,是从右向左数的.因此当他看到123时会说"321". 现在有一位德国来的教授在郑州大学进行关于ACM的讲座.现在他聘请你来担任他的助理,他给你一些资料让你找到这些资料在书中的页数.现在你已经找到了对应的页码,要用英文把页码告诉他. 为了简化我们的问题,你只需要返回单词的大写的首字母.(数字0读成字母

nyoj 69 数的长度

数的长度 时间限制:3000 ms  |  内存限制:65535 KB 难度:1 描述 N!阶乘是一个非常大的数,大家都知道计算公式是N!=N*(N-1)······*2*1.现在你的任务是计算出N!的位数有多少(十进制)? 输入 首行输入n,表示有多少组测试数据(n<10)随后n行每行输入一组测试数据 N( 0 < N < 1000000 ) 输出 对于每个数N,输出N!的(十进制)位数. 样例输入 3 1 3 32000 样例输出 1 1 130271 斯特林公式:S=log10(2

nyoj 33 蛇形填数

蛇形填数 时间限制:3000 ms  |            内存限制:65535 KB 难度:3 描述 在n*n方陈里填入1,2,...,n*n,要求填成蛇形.例如n=4时方陈为: 10 11 12 1 9 16 13 2 8 15 14 3 7  6  5 4 输入 直接输入方陈的维数,即n的值.(n<=100) 输出 输出结果是蛇形方陈. 样例输入 3 样例输出 7 8 1 6 9 2 5 4 3 1 #include <iostream> 2 using namespace s

南阳OJ 1170 最大的数

最大的数 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 小明和小红在打赌说自己数学学的好,于是小花就给他们出题了,考考他们谁NB,题目是这样的给你N个数 在这n个数之间添加N-1个*或+,使结果最大,但不可以打乱原顺序,请得出这个结果 如 1 3 5 结果是(1+3)*5=20:最大 可以添加若干个括号,但一定要保证配对,但是每两个数之间只可能有一个*或+ 数列最前和最后不应有+或乘 小明想赢小红但是他比较笨,请你帮帮他 输入 多组测试数据以EOF结束,每组有一个

NYOJ 1085 数单词 (AC自动机模板题)

数单词 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 为了能够顺利通过英语四六级考试,现在大家每天早上都会早起读英语. LYH本来以为自己在6月份的考试中可以通过六级,可是没想到,成绩出来以后,居然没有通过.所以他不得不付出更多的时间来学习英语. 要想通过六级,最基本的要求就是词汇量.为了能够更快的记住一些陌生单词,LYH有时会找一些英语文章来读. 今天早上,LYH又找了一篇文章.读之前,他突然萌生出一个想法:文章中哪些单词出现的次数最多呢? 输入 第一行输入一个

数的长度 NYOJ 69

1 #include<stdio.h>//数的长度(69) 2 #include<math.h> 3 int main() 4 { 5 int x,i,m; 6 double sum; 7 scanf("%d",&x); 8 while(x--){ 9 scanf("%d",&m); 10 sum=0; 11 for(i=1;i<=m;i++){ 12 sum=log10(i)+sum; 13 } 14 printf(&