Đề thi tin học trẻ không chuyên Đồng Nai 2007 - help !!!

Thảo luận trong 'Lập trình & Đồ hoạ' bắt đầu bởi :ToanAZ:, 26/6/07.

  1. :ToanAZ:

    :ToanAZ: Legend of Zelda

    Tham gia ngày:
    8/3/05
    Bài viết:
    975
    Nơi ở:
    ???
    1/ Điền số
    Cho một bảnh 2 chiều kích thước n*n. Hãy thực hiện điền các số nguyên dương vào bảng theo quy luật sau :
    - Ô (1,1) (góc trái trên) bằng 1.
    - Thứ tự điền theo dòng từ trên xuống và theo cột từ trái sang phải.
    - Giá trị điền vào ô tại dòng i, cột j phải là số nhỏ nhất chưa xuất hiện tron dòng i và cột j
    VD : với n=5
    1 2 3 4 5
    2 1 4 3



    Số nhỏ nhất chưa xuất hiện trên dòng 2 và cột 4 là 3
    KQ :
    1 2 3 4 5
    2 1 4 3 6
    3 4 1 2 7
    4 3 2 1 8
    5 6 7 8 1
    Có ai rảnh rảnh solve giúp em mấy đề này với ...

    2/ Số đối xứng
    Một số được gọi là số đối xứng khi các chữ số của nó đối xứng qua tâm. Ví dụ : 5, 44, 212, 71217. Cho một số x = 371, số đối xứng lớn hơn và gần x nhất là 373.
    Yêu cầu : cho một số nguyên dương x (x có số chữ số <= 100), hãy tìm số đối xứng lớn hơn và gần x nhất.

    3/ Tập sinh
    Cho một tập T gồm n số nguyên dương, các số có thể trùng nhau. Hãy chọn ra một tập S nhỏ nhất các số trong T sao cho mọi số trong T đều có thể viết dưới dạng tổng các số trong S.
    Dữ liệu vào từ file văn bản TAPSINH.INP
    -Dòng đầu là số n (n<=1000)
    -n dòng tiếp theo là n số nguyên dương a1,a2,... an (a1<=10000 , i = 1...n)
     
  2. .::Rocker::.

    .::Rocker::. Mr & Ms Pac-Man

    Tham gia ngày:
    5/2/06
    Bài viết:
    146
    mịe hỏi thế này thì đ. ai trả lời được !!!
    Đề thi là dùng ngôn ngữ lập trình nào chứ: Pascal, C, C++, VB,... !
     
  3. :ToanAZ:

    :ToanAZ: Legend of Zelda

    Tham gia ngày:
    8/3/05
    Bài viết:
    975
    Nơi ở:
    ???
    THPT thì tất nhin là pascal và c,c++ rồi .....
    các anh sem giải giúp em vớii ......
     
  4. hacker_IT

    hacker_IT Youtube Master Race

    Tham gia ngày:
    2/7/06
    Bài viết:
    30
    Bài 1:

    uses crt;
    var n,i,j,try:integer;
    a:array[1..100,1..100] of integer;

    function kt:boolean;
    var m:integer;
    begin
    kt:=true;

    for m:= 1 to i-1 do
    if a[m,j] = a[i,j] then
    begin
    kt:=false;
    exit;
    end;

    for m:= 1 to j-1 do
    if a[i,m] = a[i,j] then
    begin
    kt:=false;
    exit;
    end;

    end;

    begin clrscr;
    write('Nhap N: '); readln(n);
    a[1,1]:=1;
    for i:=1 to n do a[1,i]:=i;

    for i:=2 to n do
    for j:=1 to n do
    begin
    try:=0;
    repeat
    inc(try);
    a[i,j]:=try;
    until kt;
    end;

    for i:=1 to n do
    begin
    for j:=1 to n do write(a[i,j]:5);
    writeln;
    end;
    readln;
    end.
     
  5. hacker_IT

    hacker_IT Youtube Master Race

    Tham gia ngày:
    2/7/06
    Bài viết:
    30
    Bài 2 thì nói thuật toán thui nhé
    vì tận 100 chữ số nên dùng luôn biến s (string) để lưu số
    Thuật toán: đầu tiên cho s = x
    Dần dần tăng s lên 1 đơn vị rồi làm 1 function kiểm tra xem nó có đối xứng ko
    Thuật toán đối xứng
    giả sử cho xâu là đối xứng. Sau đó:
    for i:= 0 to (length(s) div 2) do
    if s[i+1] <> s[length(s) - i) then
    (ko phải đối xứng)

    Bài 3 bạn thử nêu 1 ví dụ nhé :D
     
  6. Xenogear

    Xenogear The Last of Us

    Tham gia ngày:
    16/6/03
    Bài viết:
    22,838
    Nơi ở:
    Sealeap Zack
    làm cách đấy lâu quá, nhỡ số nó 1 tỉ tỉ hay lớn hơn nữa thì ngồi cộng 1 dần thì có dùng c2d hay quadcore cũng có mà đến tết, mà đã chuyển thành string rồi thì cộng 1 thế nào được nữa, mà có cộng được cũng dính overflow ngay nếu không dùng double(tận 100 chữ số)
    trong trường hợp giả thuyết, trường hợp xấu nhất là 10^100 phép tính, trường hợp xấu nhất thực tế có thể dễ dàng lên đến 10^50-1 phép tính vd. 99999...90000 (50 số 9, 50 số 0) nhìn vào thấy ngay số đối xứng gần nhất là 9999..999(100 số 9), nhưng nếu cộng dần 1 thì phải cộng từ 000...000 lên 9999...9999 máy tính nhanh nhất bây giờ là 360 teraflops tức là 360*10^12 phép tính một giây, để tính được 10^50 phép tính với double thì mất khoảng 3*10^37 giây, tuổi của vũ trụ hiện tại là 4.3*10^17 giây (13.7 tỉ năm)
    cho nên cách cộng 1 có thể giải quyết được với những số nhỏ, còn đề bài cho số tận 100 chữ số thì không thể dùng cách này được, hiệu suất quá thấp.
    cách tớ chọn là parse chữ số đấy thành 1 string, kiểm tra xem string đấy có bao nhiêu char, nếu lẻ thì cắt ra làm 2 phần bằng nhau, bỏ số chính giữa, nếu chẵn thì chỉ việc cắt đôi
    sau đấy đặt 2 giá trị trong 2 string mới thành float (giờ chỉ còn tối đa 50 chữ số trong 1 số nên dùng float được)
    nếu số bên trái lớn hơn số bên phải thì đơn giản, chỉ cần cho giá trị số bên phải bằng số bên trái rồi đổi 2 số trở lại thành string rồi gộp lại chuyển qua dạng double là xong
    nếu số bên trái lại nhỏ hơn số bên phải thì cộng một vào số bên trái rồi cho số bên phải bằng số bên trái, tiếp tục các bước gộp 2 số, trở lại thành string rồi parse ngược trở lại double
    thuật toán k0 có gì khó, nhưng mà trước giờ tớ chỉ code bằng java với python, pascal bao nhiêu năm rồi không đụng đến nữa nên chỉ có thể nói thuật toán được thôi
     
  7. maxpayne new

    maxpayne new The Warrior of Light

    Tham gia ngày:
    21/2/04
    Bài viết:
    2,153
    Nơi ở:
    Nowhere
    Lâu oy` ko đụng đến Pascal nhưng theo ý kiến thì đề thi năm nay cũng vừa tầm. Đề 1 & 2 ko khó lắm, vừa đọc lướt qua nên chưa dám đưa ra thuật toán nào vì chưa làm thử, nó ko tốt thì ... :D . Nhưng nói chung thì cái thuật toán bài 2 của Raegonex thì có vẻ rất tốt vs những test vừa thử vs notepad . Còn thuật toán của ông hacker_IT thì xin lỗi là :)) ... vứt đi .
    Thôi để các cao thủ bàn tiếp, đang suy nghĩ thử bài 3
     
  8. crystalsnow

    crystalsnow Youtube Master Race

    Tham gia ngày:
    9/6/08
    Bài viết:
    2
    đối với bài 2 cho hỏi là nếu như số đó là 1259652 thì dùng string làm sao nhỉ?đâu thể tăng lên một số nữa đâu. nó sẽ đưa đến " : " mất=:-?
     
  9. crystalsnow

    crystalsnow Youtube Master Race

    Tham gia ngày:
    9/6/08
    Bài viết:
    2
    là lính mới và cũng đang mày mò pascal nên xin chỉ giáo nhiều. mong các đại ca nói rõ giùm float là gì và đối với bài 2 thì bài giải cụ thể như thế nào
     
  10. 50gbngoailuong

    50gbngoailuong Youtube Master Race

    Tham gia ngày:
    11/6/08
    Bài viết:
    59
    float là kiểu thực, int là nguyên, double lớn hơn float đại loại thế
    .
    ___________Auto Merge________________

    .
    bài 3 cao siêu quá chả hiểu đề
     
  11. Shaman Mập

    Shaman Mập Donkey Kong

    Tham gia ngày:
    8/12/05
    Bài viết:
    328
    Nơi ở:
    HCM
    ToanAZ ở Đồng Nai à ?

    Hớ hớ, anh là Đào, giải 1 Đồng Nai - tin học trẻ không chuyên năm 2001
    Giải 2 Toàn quốc phần mềm 1998

    ^^
    Cho anh gửi lời hỏi thâm đến cô - Nhà thiếu nhi Đồng Nai
    Thầy gì Mập mập nhé, lâu quá, anh quên hết cả tên
    Anh học dưới anh Ngôn 1 năm
     
  12. love_iu2

    love_iu2 Youtube Master Race

    Tham gia ngày:
    12/6/08
    Bài viết:
    1
    Bạn dùng đệ qui này để tăng xâu lên một đơn vị nè

    procedure incstr(k:integer);
    begin
    if s[k]='9' then
    begin
    s[k]:'0';
    incstr(k-1);
    end else s[k]:=char(ord(s[k])+1);
    end;

    Nhưng mà mình không dùng cái này để mỗi lần lặp rồi kiểm tra xâu này có đối xứng hay không, Nếu dùng như vậy chỉ cần 20 chữ số là đến tết rồi chớ nói gì đến 100 chữ số. mình dùng cách xét, như vậy chương trình sẽ thông minh hơn, chứ không ngu như cách tăng. Với lại chấp cho ban tổ chức ra 200 chứ số cũng không ngán, chương trình cũng chạy chưa tới 1/1000 giây.
    Mọi người thử nha. Năm nay nếu hên thì mình cũng được đi thi.
     
  13. fidodaica110

    fidodaica110 T.E.T.Я.I.S

    Tham gia ngày:
    17/3/07
    Bài viết:
    652
    Nơi ở:
    The shadow of shadow
    Pro ghê :x
     
  14. yeulatieu

    yeulatieu Youtube Master Race

    Tham gia ngày:
    13/1/07
    Bài viết:
    15
    óc óc óc
    khỏi nói nhìu
    có khi thèng học đại học cntt 4 năm cũng rớt với cái đề tào lao mía ghim này thoai....
     
  15. dhl012

    dhl012 C O N T R A

    Tham gia ngày:
    21/1/07
    Bài viết:
    1,755
    Nơi ở:
    vô tỉnh
    về bài thứ 2 tớ đưa ra thuật toán thế này:
    đầu tiên chia đưa số về chuỗi.
    chia đôi chuỗi rồi xem nó có gần đối xứng không, và có khả năng đối xứng khi nâng 1,2,3... 1 nghìn đơn vị hay không.
    nếu có, xuất ra số gần nhất.
    nếu không, nhích vị trí chính giữa lên một đơn vị, giờ đây ta có 2 phần không bằng nhau, lệch nhau 1 chữ số. Bây giờ thêm một chữ số vào cuối dãy số để được dãy bằng dãy trước.
    lại kiểm tra xem có đối xứng hay không.
    tiếp tục cho đến khi số chính giữa hiện tại là số cuối của số ban đầu thì ngừng.
     
  16. thanhtungtnt

    thanhtungtnt You Must Construct Additional Pylons Lão Làng GVN

    Tham gia ngày:
    23/8/06
    Bài viết:
    8,817
    Nơi ở:
    Balamb City
    Chà, đề nhìn vậy mà cũng hơi nhức đầu chút.
     
  17. toi5

    toi5 Try Hard Moderator Lão Làng GVN

    Tham gia ngày:
    27/5/03
    Bài viết:
    6,866
    bài 2 thì dùng đảo ngược số đi, nếu số sau khi đảo ngược bằng y chang số lúc đầu thì nó là đối xứng.......
    xét gần x nhất và lớn hơn x thì dùng for xét lên, gặp số nào đối xứng thì dừng.......(dùng break, ko dùng break thì càng tốt)......
     
  18. huythanhv2

    huythanhv2 Donkey Kong

    Tham gia ngày:
    13/1/06
    Bài viết:
    401
    Nơi ở:
    Adelaide
    đã chạy (N^2), trong mỗi n^2 lại chạy thêm từ 1 đến hơn N, tình hình là k ổn, nên đặt cận để giảm độ phức tạp, nếu hay hơn thì sẽ thấy ma trận kết quả đối xứng
     

Chia sẻ trang này