PDA

View Full Version : giải được cho 10000VND



longni123456789
01-09-2009, 22:07
Cho 1 số nguyên dương N ko lớn hơn 10^9. Hãy biểu diễn N thành tổng các số nguyên dương khác nhau sao cho tích M của các số hạng là lớn nhất. Dữ liệu vào từ file 12.inp gồm các dòng ghi số N, dữ liệu ra ở file 12.out ghi số M ở dòng tương ứng.
Giải đi, giải được cho 10000VND, qua Mỹ nhận giải nha

quangtq
02-09-2009, 08:39
Bài như này mà cho có mỗi thế thôi à? Nản quá.
Nhận xét: Các số có tổng không đổi thì tích lớn nhất khi các số bằng nhau (Cái này hệ quả của Cauchy).
=> Tìm cách phân tích ra sao cho chênh lệch ít nhất.
Đơn giản! :D

hang_vt
02-09-2009, 09:26
- cái title hơi quá =.=! , xh h` cái j` cũng quy ra tiền nhỉ :))
- dùng pp rải đậu


const fi='12.inp';
fo='12.out';
max=100000000;
var f:text;
n,s,m:longint;
a:array[1..max] of longint;
procedure inp;
begin
assign(f,fi);
reset(f);
readln(f,n);
close(f);
end;
procedure test;
var i,t:longint;
begin
t:=0;
i:=0;
if n=1 then m:=1 else m:=2;
while t+m<=n do
begin
inc(i);
t:=t+m;
a[i]:=m;
inc(m);
end;
m:=i;
t:=n-t;
repeat
i:=m;
while (t>0) and (i>0) do
begin
a[i]:=a[i]+1;
dec(t);
dec(i);
end;
until t<=0;
end;
procedure pri;
var i:longint;
begin
assign(f,fo);
rewrite(f);
writeln(f,m);
for i:=1 to m do
writeln(f,a[i]);
close(f);
end;
begin
inp;
test;
pri;
end.

mr_invincible
02-09-2009, 21:55
Bài như này mà cho có mỗi thế thôi à? Nản quá.
Nhận xét: Các số có tổng không đổi thì tích lớn nhất khi các số bằng nhau (Cái này hệ quả của Cauchy).
=> Tìm cách phân tích ra sao cho chênh lệch ít nhất.
Đơn giản! :D

vấn đề: phân tích ra bao nhiêu số?
Nếu mình nhớ ko nhầm thì ngoài vài giá trị N đủ nhỏ để làm tay, còn lại phân tích ra thành toàn 2 với 1 hoặc 0 số 3 thì phải

p.s. 10K thì hơi ít =((

quangtq
03-09-2009, 17:31
@RR: Phân tích ra thành tổng, thế nên cứ tương 2 vào thôi.
N chẵn hoặc lẻ thì cũng thế này.
Đáp án:
M = 2^(n div 2).
Chuẩn rồi.
:D

mr_invincible
04-09-2009, 00:52
:| N lẻ: 2^(n div 2 - 1)*3 (> 2^(n div 2) )

Chứng minh?...

quangtq
04-09-2009, 15:14
Uhm.
Em ko nghĩ kĩ.
Chắc N lẻ thì
đặt T = (n div 2)^2
và M = T * (N-2*T)
Phần N-2*T tiếp tục thực hiện như trên đến khi còn là 1.
P/S: Dạo này anh Trung rảnh rỗi được sang đây à?
VNOI ko có việc gì làm ???? :D

hang_vt
04-09-2009, 20:53
giúp mình giải bt này với
đề bài này
Nhập vào ngày tháng năm. xac định vào thứ nào trong tuần biết công thức xác định thứ như sau
thứ = (ngày+tháng*2+(tháng+1)*3Div5+nămDiv4+5)Mod7
nếu tháng nhỏ hơn 3thif
tháng:=tháng+12
năm:=năm+1

có công thức thì cứ việc thay vào thôi


Uses CRT;
Var
day,month,year:longint;

Function thu(d,m,y:integer):integer;
Var
century,yr,dw:integer;
Begin
if m<3 then
begin
m:=m+10;
y:=y-1;
end
else
m:=m-2;

century:=y div 100;
yr:=y mod 100;

dw:=(((26 * m - 2) div 10) + d + yr + (yr div 4) +
(century div 4) - ( 2 * century)) mod 7;

if dw < 0 then
thu:=dw + 7
else
thu:=dw;

End;

BEGIN
Clrscr;
Write('Nhap vao ngay '); readln(day);

Write('Nhap vao thang ');readln(month);

Write('Nhap vao nam ');readln(year);

Write('Day la thu : ');

Case thu(day,month,year) of
0: Writeln(' Chu Nhat');
1: Writeln(' Thu Hai');
2: Writeln(' Thu Ba');
3: Writeln(' Thu Tu');
4: Writeln(' Thu Nam');
5: Writeln(' Thu Sau');
6: Writeln(' Thu Bay');
End;

Readln;
end.


[=========> Bổ sung bài viết <=========]

mà thang : = thang + 10 chớ , 12 thì toi r` . 1 năm có 12 tháng àh :(

[=========> Bổ sung bài viết <=========]

nam = nam-1 chứ . Type công thức sai tùm lum :(

hang_vt
06-09-2009, 22:36
thử bỏ lệnh "Uses CRT;" và "Clrscr;" thử

lehuong109
06-09-2009, 22:40
Cho 1 số nguyên dương N ko lớn hơn 10^9. Hãy biểu diễn N thành tổng các số nguyên dương khác nhau sao cho tích M của các số hạng là lớn nhất. Dữ liệu vào từ file 12.inp gồm các dòng ghi số N, dữ liệu ra ở file 12.out ghi số M ở dòng tương ứng.
Giải đi, giải được cho 10000VND, qua Mỹ nhận giải nha

Sao lại có kẻ hách xì dầu như này trong diễn đàn zị ta?

hang_vt
09-09-2009, 14:59
cái này là do bạn type sai mà
chỉ có "thu:=dw+7" chứ làm j` có dấu ; nữa

duongdragonxxx
09-09-2009, 17:30
mịa, dốt hok jải dc cứ vào 4rum húng

duydragon
10-09-2009, 21:57
- cái title hơi quá =.=! , xh h` cái j` cũng quy ra tiền nhỉ :))
- dùng pp rải đậu


const fi='12.inp';
fo='12.out';
max=100000000;
var f:text;
n,s,m:longint;
a:array[1..max] of longint;
procedure inp;
begin
assign(f,fi);
reset(f);
readln(f,n);
close(f);
end;
procedure test;
var i,t:longint;
begin
t:=0;
i:=0;
if n=1 then m:=1 else m:=2;
while t+m<=n do
begin
inc(i);
t:=t+m;
a[i]:=m;
inc(m);
end;
m:=i;
t:=n-t;
repeat
i:=m;
while (t>0) and (i>0) do
begin
a[i]:=a[i]+1;
dec(t);
dec(i);
end;
until t<=0;
end;
procedure pri;
var i:longint;
begin
assign(f,fo);
rewrite(f);
writeln(f,m);
for i:=1 to m do
writeln(f,a[i]);
close(f);
end;
begin
inp;
test;
pri;
end.


Ông nội, cái này tới 10^4 là hết ke rồi, xài phương pháp xử lý số lớn đi.

hang_vt
11-09-2009, 16:16
Ông nội, cái này tới 10^4 là hết ke rồi, xài phương pháp xử lý số lớn đi.

- mình là girl
- mình đã test thử , chạy đc tới 10^9
- nếu bạn có code của bài này mà vik = pp xử lí số lớn thì post lên mình tham khảo vs . Thax

quangtq
11-09-2009, 16:20
Sặc. Chả hiểu bạn thế nào nữa :|
Code của chị Hằng chuẩn rồi.
Sau 2 dòng đấy


if dw<0 then thu:=dw+7 else thu:=dw;
// Them dong nay la in ra con gi
Writeln('thu = ',thu);

Nản quá.

hang_vt
11-09-2009, 16:22
mình gán ùi in , bạn in trực típ . K bài nào sai cả :)