HDOJ:5586
2015-12-04 10:48
239 查看
[align=left]Problem Description[/align]
There is a number sequence A
1
,A
2
....A
n
,you can select a interval [l,r] or not,all the numbers A
i
(l≤i≤r)
will become f(A
i
)
.f(x)=(1890x+143)mod10007
.After that,the sum of n numbers should be as much as possible.What is the maximum sum?
[align=left]Input[/align]
There are multiple test cases.
First line of each
case contains a single integer n.(1≤n≤10
5
)
Next line contains n integers A
1
,A
2
....A
n
.(0≤A
i
≤10
4
)
It's guaranteed that ∑n≤10
6
.
[align=left]Output[/align]
For each test case,output the answer in a
line.
[align=left]Sample Input[/align]
2
10000 9999
5
1 9999 1 9999 1
[align=left]Sample Output[/align]
19999
22033
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int n;
int a[100010],b,c[100010];
int i,sum,count;
while(scanf("%d",&n)!=EOF)//多组测试数据
{
sum=0;
for(i=0;i<n;i++)
{
cin>>a[i];
b=(1890*a[i]+143)%10007;
c[i]=b-a[i];//子序列
sum+=a[i];//原序列的和
}
for(i=1;i<n;i++)
{
c[i]=max(c[i],c[i-1]+c[i]);
}//动态规划求最大子序列的和
count=0;
for(i=0;i<n;i++)
{
if(count<=c[i])
count=c[i];
}
printf("%d\n",sum+count);
}
return 0;
}
There is a number sequence A
1
,A
2
....A
n
,you can select a interval [l,r] or not,all the numbers A
i
(l≤i≤r)
will become f(A
i
)
.f(x)=(1890x+143)mod10007
.After that,the sum of n numbers should be as much as possible.What is the maximum sum?
[align=left]Input[/align]
There are multiple test cases.
First line of each
case contains a single integer n.(1≤n≤10
5
)
Next line contains n integers A
1
,A
2
....A
n
.(0≤A
i
≤10
4
)
It's guaranteed that ∑n≤10
6
.
[align=left]Output[/align]
For each test case,output the answer in a
line.
[align=left]Sample Input[/align]
2
10000 9999
5
1 9999 1 9999 1
[align=left]Sample Output[/align]
19999
22033
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int n;
int a[100010],b,c[100010];
int i,sum,count;
while(scanf("%d",&n)!=EOF)//多组测试数据
{
sum=0;
for(i=0;i<n;i++)
{
cin>>a[i];
b=(1890*a[i]+143)%10007;
c[i]=b-a[i];//子序列
sum+=a[i];//原序列的和
}
for(i=1;i<n;i++)
{
c[i]=max(c[i],c[i-1]+c[i]);
}//动态规划求最大子序列的和
count=0;
for(i=0;i<n;i++)
{
if(count<=c[i])
count=c[i];
}
printf("%d\n",sum+count);
}
return 0;
}
相关文章推荐
- 数据库设计中的四个范式(转)
- 双for循环实现九九乘法表
- Servlet中文乱码问题及解决方案剖析
- Ⅰ.14 如何处理测试脚本发生的异常
- Wi-Fi: Peer-to-Peer Services Technical Spec
- mysql-5.7.9-winx64 MySQL服务无法启动,服务没有报告任何错误的解决办法
- VS2010+Opencv-2.4.0的配置攻略
- Android控件之ListView与BaseAdapter
- Oracle11gR2学习笔记汇总
- 浏览器内核分类
- Dubbo架构设计详解
- 流式布局
- web.xml的一些个配置
- C\C++中的整形提升
- 装配置mysql-5.7.5-m15-winx64
- ssl 复制
- Bugfree 搭建
- 开源界何时不再玩捉迷藏游戏?
- JS运动--分享到空间代码样式
- 在android开发中使用multdex的方法-IT蓝豹为你整理