第一题:
2150. 【2017.7.7普及】和谐数
(File IO): input:a.in output:a.out
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
Goto ProblemSet
题目描述
给定一个长度为N的序列a,对于每一个数都可选或不选,把选出的数有序组成一个新的序列b,使b序列的“和谐数”最大。
一个序列的和谐数如下定义:对于位置i,如果第奇数次选的则加上bi,偶数次选的则减去bi
注意:新的序列b必须是从左到右依次在a序列选择的,即不能打乱顺序。
输入
输入的第一行是一个n,第二行为n个数,即序列a
输出
输出一行一个整数,即表示最大的和谐数
样例输入
5
1 2 3 4 5
Sample Input2
6
1 3 5 4 6 8
样例输出
5
Sample Output2
9
题意:
选数,选出来最大就好了。
DP再好不过了。
数据范围限制
对于20%的数据,1<=n<=20
对于50%的数据,1<=n<=1000
对于100%的数据,1<=n<=10000000,1<=Ai<=100
var
i,j,k,n,m,l,x,s:longint;
f:array[0..10000001,1..2]of int64;
function max(a,b:longint):longint;
begin
if a>b then exit(a)
else exit(b);
end;
procedure aa;
var
i,j:longint;
begin
for i:=1 to n do
begin
read(x);
f[i,2]:=max(f[i-1,2],f[i-1,1]-x);
f[i,1]:=max(f[i-1,1],f[i-1,2]+x);
end;
end;
begin
assign(input,’a.in’); reset(input);
assign(output,’a.out’);rewrite(output);
readln(n);
aa;
writeln(max(f[n,2],f[n,1]));
close(input);
close(output);
end.
第二题:
其实这题我不是很理解。
质因数分解。然后.(wo).(jiu).(shen).(me).(ye).(bu).(zhi).(dao).(le)…
2151. 【2017.7.7普及】分数
(File IO): input:count.in output:count.out
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
Goto ProblemSet
题目描述
ProKing来到了家里,忽然发现桌台上有n1个玩偶,每个玩偶上有一个对应的值,而在桌台下也有n2个玩偶,每个玩偶上也有一个对应的值,现在,proking想知道台上的玩偶的默契值除以台下玩偶的默契值得到的既约分数(既约分数就是分子分母最大公约数为1的分数)
默契值定义为所有玩偶的权值的乘积.
输入
输入的第一行是一个n1,后面n1个整数,即序列a;输入的第二行是一个n2,后面n2个整数,即序列b
输出
输出一行两个整数,中间用空格隔开,即表示分子和分母
样例输入
3 1 2 3
4 3 5 2 1
Sample Input2
5 4 6 8 3 2
10 1 2 3 4 5 6 7 8 9 10
样例输出
1 5
Sample Output2
1 3150
数据范围限制
对于20%的数据,n1,n2<=10,Ai,Bi<=10
对于60%的数据,n1,n2<=1000,Ai,Bi<=1000
对于100%的数据,n1,n2<=100000,Ai,Bi<=10000
数据保证不会出现分数的值为0的情况
程(la)序(la):
const max=2300;
mo=100000000;
var n:array[1..2]of int64;
a,s,l:array[0..100101,1..2]of int64;
x,z,y:int64;
i,j,k:longint;
zs:array[0..12624]of int64;
procedure zxs;
var i,x:longint;
begin
for i:=2 to 10000 do
begin
x:=0;
for j:=2 to trunc(sqrt(i)) do
if (i mod j=0) then
begin
zs[i]:=j; x:=j;
break;
end;
if x=0 then zs[i]:=i;
end;
end;
procedure aa;
begin
read(n[1]);
for i:=1 to n[1] do read(a[i,1]);
readln;
read(n[2]);
for i:=1 to n[2] do read(a[i,2]);
zxs;
for i:=1 to 2 do
for j:=1 to n[i] do
begin
x:=a[j,i];
while x>1 do
begin
inc(s[zs[x],i]);
x:=x div zs[x];
end;
end;
for i:=2 to 10000 do
if (s[i,1]>0)and(s[i,2]>0) then
if (s[i,1]>s[i,2]) then begin s[i,1]:=s[i,1]-s[i,2]; s[i,2]:=0; end
else begin s[i,2]:=s[i,2]-s[i,1]; s[i,1]:=0; end;
l[max,1]:=1; l[max,2]:=1;
for i:=1 to 2 do
for j:=2 to 10000 do
begin
z:=s[j,i];
while z>0 do
begin
dec(z);
for k:=2 to max do l[k,i]:=l[k,i]*j;
for k:=max downto 2 do
if l[k,i]>9 then
begin
l[k-1,i]:=l[k-1,i]+l[k,i] div mo;
l[k,i]:=l[k,i] mod mo;
end;
end;
end;
x:=0;
for i:=1 to 2 do
begin
for j:=0 to max do
if l[j,i]>0 then
begin
x:=j;
break;
end;
write(l[x,i]);
for j:=x+1 to max do
begin
y:=l[j,i]; z:=0;
if y=0 then y:=1;
while y