Announcement

Collapse
No announcement yet.

[isteam test 2011] k4,5,6

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • #16
    Mình bên KHMT cũng xin mạn phép post bài 2 để thảo luận nha ^^
    Code:
    program bt2;
    uses crt;
    var a,b,n,i,j,tong,x:longint; k:boolean;
    function xetnam(n:longint):boolean;
             begin
                  if((n mod 4=0)and(n mod 100<>0))or(n mod 400=0)then xetnam:=true else xetnam:=false;
             end;
    begin
         clrscr;
         repeat
         write('Nhap ngay thang nam: ');
         readln(a,b,n);
         until (n>=1900)and(b<=12)and(a<=31);
         writeln('Ngay ',a,' Thang ',b,' Nam ',n);
         tong:=0;
         for i:=1900 to n-1 do if(xetnam(i)=true)then tong:=tong+366 else tong:=tong+365;
         x:=(b-1) div 2;
         if(b=1)then tong:=tong+a else if(b=2)then tong:=tong+31+a else if(b>2)then
                     begin
                          if(xetnam(n)=true)then tong:=tong+29+a+(x+1)*31+(b-2-(x+1))*30 else
                                         tong:=tong+28+a+(x+1)*31+(b-2-(x+1))*30;
                     end;
         j:=tong mod 7;
         if(j=0)then write('Chu Nhat') else if(j=1)then write('Thu hai') else
         if(j=2)then write('Thu ba') else if(j=3)then write('Thu tu') else
         if(j=4)then write('Thu nam') else if(j=5)then write('Thu sau') else if(j=6)then write('Thu bay');
         readln;
    end.
    CHỗ xét thứ có thể dùng case of cũng được nhưng mình dùng If cho nó đỡ tốn line

    Comment


    • #17
      Code:
      ok:=false;
      dem:=0;
      For i:=1 to k do
       For j:=i to k do
       If a[i] + a[j] = N then
                           begin
                           ok:=true;
                           b[1]:=a[i];
                           b[2]:=a[j];
                           inc(dem);
                           Writeln('Cach thu ',dem);
                           Write(b[1],'+',b[2]);
                           writeln;
                           end;
      
      If ok=false then
                   begin
                   For i:=1 to k do
                    For j:=i to k do
                     For h:=j to k do
                     If a[i] + a[j] + a[h] = n then
                                               begin
                                               b[1]:=a[i];
                                               b[2]:=a[j];
                                               b[3]:=a[h];
                                               inc(dem);
                                               Writeln('Cach thu ',dem);
                                               Write(b[1],'+',b[2],'+',b[3]);
                                               writeln;
                                               end;
                   end;
      hihi hay nè! bravo! lúc đầu bí quá t kiếm ra giả thuyết đó mà nghĩ nó chưa đc cminh nên cũng ko dám nghĩ tiếp. Giờ nghĩ lại làm cách này nếu giả thuyết này đúng thì sẽ đỡ khối time. nhập vào 600 chắc ngon ơ chứ ko đệ quy lòng vòng làm chờ mỏi cổ! hix! Hay đó bạn Hoàng!

      Comment


      • #18
        Originally posted by mikun93 View Post
        Mình bên KHMT cũng xin mạn phép post bài 2 để thảo luận nha ^^
        Code:
        program bt2;
        uses crt;
        var a,b,n,i,j,tong,x:longint; k:boolean;
        function xetnam(n:longint):boolean;
                 begin
                      if((n mod 4=0)and(n mod 100<>0))or(n mod 400=0)then xetnam:=true else xetnam:=false;
                 end;
        begin
             clrscr;
             repeat
             write('Nhap ngay thang nam: ');
             readln(a,b,n);
             until ([B]n>=1900[/B])and(b<=12)and(a<=31);
             writeln('Ngay ',a,' Thang ',b,' Nam ',n);
             tong:=0;
             for [B]i:=1900[/B] to n-1 do if(xetnam(i)=true)then tong:=tong+366 else tong:=tong+365;
             x:=(b-1) div 2;
             if(b=1)then tong:=tong+a else if(b=2)then tong:=tong+31+a else if(b>2)then
                         begin
                              if(xetnam(n)=true)then tong:=tong+29+a+(x+1)*31+(b-2-(x+1))*30 else
                                             tong:=tong+28+a+(x+1)*31+(b-2-(x+1))*30;
                         end;
             j:=tong mod 7;
             if(j=0)then write('Chu Nhat') else if(j=1)then write('Thu hai') else
             if(j=2)then write('Thu ba') else if(j=3)then write('Thu tu') else
             if(j=4)then write('Thu nam') else if(j=5)then write('Thu sau') else if(j=6)then write('Thu bay');
             readln;
        end.
        CHỗ xét thứ có thể dùng case of cũng được nhưng mình dùng If cho nó đỡ tốn line
        Tốn line nữa mới ghê chứ. Chém vừa thôi chú.
        Ừm chú này cùng ý tưởng với mình nè, nhưng những chỗ bôi đen nên sửa 1900 thành 1, đồng thời chỉnh sửa 1 chút về điều kiện của phép chia mod thì có thể tính được từ năm 1 trớ về sau lun chứ ko phải sau năm 1900 ko đâu.
        Nếu bạn không đủ giỏi, đừng cố đi ngược đám đông.

        Comment


        • #19
          Originally posted by mikun93 View Post
          Mình bên KHMT cũng xin mạn phép post bài 2 để thảo luận nha ^^
          Code:
          program bt2;
          uses crt;
          var a,b,n,i,j,tong,x:longint; k:boolean;
          function xetnam(n:longint):boolean;
                   begin
                        if((n mod 4=0)and(n mod 100<>0))or(n mod 400=0)then xetnam:=true else xetnam:=false;
                   end;
          begin
               clrscr;
               repeat
               write('Nhap ngay thang nam: ');
               readln(a,b,n);
               until (n>=1900)and(b<=12)and(a<=31);
               writeln('Ngay ',a,' Thang ',b,' Nam ',n);
               tong:=0;
               for i:=1900 to n-1 do if(xetnam(i)=true)then tong:=tong+366 else tong:=tong+365;
               x:=(b-1) div 2;
               if(b=1)then tong:=tong+a else if(b=2)then tong:=tong+31+a else if(b>2)then
                           begin
                                if(xetnam(n)=true)then tong:=tong+29+a+(x+1)*31+(b-2-(x+1))*30 else
                                               tong:=tong+28+a+(x+1)*31+(b-2-(x+1))*30;
                           end;
               j:=tong mod 7;
               if(j=0)then write('Chu Nhat') else if(j=1)then write('Thu hai') else
               if(j=2)then write('Thu ba') else if(j=3)then write('Thu tu') else
               if(j=4)then write('Thu nam') else if(j=5)then write('Thu sau') else if(j=6)then write('Thu bay');
               readln;
          end.
          CHỗ xét thứ có thể dùng case of cũng được nhưng mình dùng If cho nó đỡ tốn line
          của bạn cũng bị ngay cái trc 1900 nhỉ?hix mà code tính năm đó mình đọc cũng ko hiểu! bạn tự nghĩ ra hả?

          Comment


          • #20
            Originally posted by 11520126 View Post
            Tốn line nữa mới ghê chứ. Chém vừa thôi chú.
            Ừm chú này cùng ý tưởng với mình nè, nhưng những chỗ bôi đen nên sửa 1900 thành 1, đồng thời chỉnh sửa 1 chút về điều kiện của phép chia mod thì có thể tính được từ năm 1 trớ về sau lun chứ ko phải sau năm 1900 ko đâu.
            vậy bạn Hoàng làm đc về trc hả? Share lên với!

            Comment


            • #21
              Originally posted by 11520673 View Post
              hihi hay nè! bravo! lúc đầu bí quá t kiếm ra giả thuyết đó mà nghĩ nó chưa đc cminh nên cũng ko dám nghĩ tiếp. Giờ nghĩ lại làm cách này nếu giả thuyết này đúng thì sẽ đỡ khối time. nhập vào 600 chắc ngon ơ chứ ko đệ quy lòng vòng làm chờ mỏi cổ! hix! Hay đó bạn Hoàng!
              Hì. Nhưng ko hiểu sao mình test mấy kết quả từ 558 trở lên thì nó lại ra thế này
              abc.jpg
              557 trở xuống thì ok.
              Nếu bạn không đủ giỏi, đừng cố đi ngược đám đông.

              Comment


              • #22
                Originally posted by 11520126 View Post
                Hì. Nhưng ko hiểu sao mình test mấy kết quả từ 558 trở lên thì nó lại ra thế này
                [ATTACH=CONFIG]1148[/ATTACH]
                557 trở xuống thì ok.
                đc r=)) t làm cách kia chắc cũng vậy. chưa thử 558 mà tới 600 là nó báo tràn mảng r dừng ctrình luôn! Hix phải chi có code ra chính xác nhỉ? tò mò gê!

                Comment


                • #23
                  À mình biết cách khắc phục bài 3 rồi. Sửa chỗ Array[1..1000] là ok.
                  Còn bài 2 của mình nè, cho copy cái Function của bạn Mikun tí nhé, để dễ nhìn hơn thui chứ điều kiện xét năm nhuận của bạn cũng y chang mình à.
                  Code:
                  program bai_2;
                  uses crt;
                  var ng,th,nam,i:integer;
                      n:longint;
                      s:string;
                  function xet(x: integer): boolean;
                   begin
                   If ((x mod 4 = 0) and (x mod 100<>0)) or (x mod 400=0)
                                    then xet:=true
                                    else xet:=false;
                   end;
                  
                  Begin
                  clrscr;
                  Repeat
                  Writeln('Nhap ngay, thang, nam:');
                  read(ng,th,nam);
                  clrscr;
                  If (th>12) or (ng>31) then Writeln('Nhap ko dung, vui long nhap lai.');
                  until (th<=12) and (ng<=31);
                  
                  If xet(nam)=true then Writeln('La nam nhuan')
                                   else Writeln('Ko phai nam nhuan');
                  
                  n:=0;
                  For i:=1 to nam-1 do
                   If xet(i)=true then n:=n+366
                                    else n:=n+365;
                  
                  For i:=1 to th-1 do
                   begin
                   If (i=1) or (i=3) or (i=5) or (i=7) or (i=8) or (i=10) or (i=12) then n:=n+31;
                   If (i=4) or (i=6) or (i=9) or (i=11) then n:=n+30;
                   If ((i=2) and xet(nam)=true) then n:=n+29;
                   If ((i=2) and xet(nam)=false) then n:=n+28;
                   end;
                  n:=n+ng;
                  n:=n mod 7;
                  Case n of
                   0: s:='CN';
                   1: s:='Thu 2';
                   2: s:='Thu 3';
                   3: s:='Thu 4';
                   4: s:='Thu 5';
                   5: s:='Thu 6';
                   6: s:='Thu 7';
                   end;
                  
                  Writeln('Ngay ban vua nhap: ',s,' - ',ng,'/',th,'/',nam);
                  
                  Readln;
                  Readln;
                  End.
                  Nếu bạn không đủ giỏi, đừng cố đi ngược đám đông.

                  Comment


                  • #24
                    Bài 2:
                    Ngày xưa mình làm, nhưng đề khác một tí, nhập năm, in ra nguyên cái lịch cho năm đó Hồi xưa nhớ là test với tất cả các năm sau công nguyên, với các năm trước công nguyên thì khi nhập số vui lòng dùng dấu - phía trước và cộng thêm 1. Ví du năm thứ 1 trước công nguyên thì nhập số 0, còn mỗi cái bug từ đời nẫm mà chưa fix

                    PHP Code:

                    // 
                    // File:   newmain.cc
                    // Author: truongan
                    //
                    // Created on October 30, 2007, 6:43 PM
                    //

                    #include <iostream>
                    #include <math.h>
                    #include <string.h>
                    #include <stdio.h>

                    #define isnhuan(y) ( ( (y%4 == 0)&&( y%100 != 0) ) || (y%400 == 0) )
                    #define GetNumday(m,y)  ( ( isnhuan(y) && (m==2) )  ?  29 : d[m-1] ) 
                    const int d[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
                    const 
                    charThu[7] = {"hai","ba ","tu ","nam","sau""bay","CN "};
                    struct date {
                        
                    int day;
                        
                    int month;
                        
                    int year;
                    };
                    //
                    // 
                    //
                    using namespace std;

                    int hople(date a){
                        
                    //Kiểm tra tính hợp lệ của ngày tháng.
                        
                    if ((a.month 1) || (a.month 12) ) return 0;
                        
                        switch (
                    a.month){
                            case 
                    1: case 3: case 5: case : case : case 10: case 12:
                                if (
                    a.day 31) return 0; break;
                            case 
                    4: case : case : case 11:
                                if (
                    a.day 30) return 0; break;
                            case 
                    2:
                                if ( (
                    a.day>29) || (!isnhuan(a.year) && (a.day>28))) 
                                    return 
                    ; break;
                        }
                        return 
                    1;
                    }
                    int sosanh(date adate b){
                        if ( !( 
                    hople(a) && hople(b))) return -2//Không hợp lệ trả về 2

                        
                    if (a.year b.year ) return 1// a> b trả về 1
                        
                    if (a.year b.year ) return -1// a< b trả về -1

                        
                    if (a.monthb.month) return 1;
                        if (
                    a.monthb.month) return -1;

                        if (
                    a.day b.day ) return 1;
                        if (
                    a.day b.day ) return -1;
                        
                    return 
                    0// bằng nhau trả về 0
                    }
                    int SubstractDate(date adate b) {
                        
                    //la^'y a-b
                        
                    int kq=0;
                        if (!(
                    hople(a) || hople(b))) return -2;
                        
                        
                    //b lo*'n ho*n a thi` lấy b-a tru*` ngu*o*.c la.i
                        
                    if (sosanh(a,b)==-1) return SubstractDate(b,a);
                        
                        while ((
                    a.month!=b.month) || (a.year != b.year)) {
                            
                    kq+= GetNumday(b.monthb.year);
                            
                    b.month++; //Tăng b đến khi b=a
                            
                    if(b.month==13) {
                                
                    b.year++;
                                
                    b.month=1;
                            }
                        }
                        
                    kq += a.day-b.day;
                        return 
                    kq;
                    }
                    int main(int argcchar** argv) {

                        
                       
                    date aa.day a.month 10a.year 2007;// lấy a=1/10/2007 làm mốc vì bữa đó thứ 2
                       
                    date bb.day  1b.month 1;
                       
                    cout << "Moi nhap nam " cin  >> b.year;
                       
                    int cSubstractDate(a,b); c= ( (sosanh(a,b)==1)? (7-c%7)%c%);
                        
                    // (7-c%7)%7 để tính ra thứ trước ngày mốc
                        
                       
                    for (;b.month <=12b.month++){
                            
                    cout << "Thang " << b.month << endl;

                            
                    cout << "Thu    " << "Ngay " << endl;
                            
                    int a GetNumday(b.monthb.year);
                            for (
                    int d1d<= ;d++){
                                
                    cout << Thu[c] << "    " << << endl;
                                
                    c= ++c%7;
                            }

                       }
                        

                    Bổ sung thêm tí là code này code lại, C++ lai với C chuẩn, phải dùng C++ compiler nó mới chạy. Hồi đó còn gà nên code hơi bị lai căng mà chính mình không biết, các bạn K6 xem chơi chứ đừng bắt chước, code cái nào chuẩn cái đó nhá.
                    Last edited by 07520004; 21-10-2011, 00:49.

                    Comment


                    • #25
                      lấy 1 ngày làm mốc r trừ đi! Đúng là ỷ có google nên tưởng ko có cách nào khác hix :-s Hình như code bạn Hoàng cũng cách này đúng ko?
                      Last edited by 11520673; 21-10-2011, 00:54.

                      Comment


                      • #26
                        Originally posted by 11520126 View Post
                        À mình biết cách khắc phục bài 3 rồi. Sửa chỗ Array[1..1000] là ok.
                        Còn bài 2 của mình nè, cho copy cái Function của bạn Mikun tí nhé, để dễ nhìn hơn thui chứ điều kiện xét năm nhuận của bạn cũng y chang mình à.
                        uh. bài này mình làm tếu lắm. Lưu tất cả tổ hợp vào một mảng 1 chiều, mỗi tổ hợp cách nhau = 1 số 0. Xong lấy một biến lọc 1 lần đếm xem tổ hợp nào có số phần tử ngắn nhất. Xong lại lọc 1 lần nữa để in tất cả tổ hợp có số phần tử ngắn nhất. kết quả array [1..10000000] mà mảng vẫn tràn. chạy 500 đếm thấy 27 triệu tổ hợp các loại. hiz

                        Comment


                        • #27
                          Originally posted by 11520673 View Post
                          lấy 1 ngày làm mốc r trừ đi! Đúng là ỷ có google nên tưởng ko có cách nào khác hix :-s Hình như code bạn Hoàng cũng cách này đúng ko?
                          Ừ! Mình lấy ngày 1/1/1 làm mốc lun, từ đó tính ra các ngày sau.
                          Nếu bạn không đủ giỏi, đừng cố đi ngược đám đông.

                          Comment


                          • #28
                            Originally posted by 11520673 View Post
                            uh. bài này mình làm tếu lắm. Lưu tất cả tổ hợp vào một mảng 1 chiều, mỗi tổ hợp cách nhau = 1 số 0. Xong lấy một biến lọc 1 lần đếm xem tổ hợp nào có số phần tử ngắn nhất. Xong lại lọc 1 lần nữa để in tất cả tổ hợp có số phần tử ngắn nhất. kết quả array [1..10000000] mà mảng vẫn tràn. chạy 500 đếm thấy 27 triệu tổ hợp các loại. hiz
                            27tr @@! Bài của mình chỉ xuất ra các đáp án có số phần tử ít nhất thôi, chứ xuất hết thì pó tay. Mai T post bài 3 của T lên xem thử ngheng.
                            Nếu bạn không đủ giỏi, đừng cố đi ngược đám đông.

                            Comment


                            • #29
                              uh! bài đó hồi google mình thấy nó ngắn ngủn mừng quá ko thèm suy nghĩ luôn! Ko ngủ hả bạn Hoàng! Tú đi ngủ đây mai bàn tiếp!

                              Comment


                              • #30
                                Originally posted by 11520126 View Post
                                27tr @@! Bài của mình chỉ xuất ra các đáp án có số phần tử ít nhất thôi, chứ xuất hết thì pó tay. Mai T post bài 3 của T lên xem thử ngheng.
                                uh để mai qua máy kia t post lên! Uh bài bạn chỉ tìm các tổ hợp có 2,3 phần tử nên chạy nhanh hơn cách t r!

                                Comment

                                LHQC

                                Collapse
                                Working...
                                X