Announcement

Collapse
No announcement yet.

Thảo luận bài tập ôn luyện Olympic- Thuật Toán

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

  • Thảo luận bài tập ôn luyện Olympic- Thuật Toán

    1079. Maximum
    Consider the sequence of numbers ai, i = 0, 1, 2, …, which satisfies the following requirements:

    a0 = 0
    a1 = 1
    a2i = ai
    a2i+1 = ai + ai+1

    for every i = 1, 2, 3, … .
    Write a program which for a given value of n finds the largest number among the numbers a0, a1, …, an.
    Input
    You are given several test cases (not more than 10). Each test case is a line containing an integer n (1 ≤ n ≤ 99 999). The last line of input contains 0.
    Output
    For every n in the input write the corresponding maximum value found.
    Sample
    input output

    5 3
    10 4
    0
    Nguồn: http://acm.timus.ru/problem.aspx?space=1&num=1079

    Bài này mình giải như sau nhưng không hiểu sai đâu?? Mọi người chỉ giáo nhé!
    Code:
    #include <iostream>
    using namespace std;
    
    int main()
    {
        long n,i=0,i_f=2;
        long arr[10], f[99999];
        f[0]=0; f[1]=1;
        do
        {
            cin>>n;
            while(n>=i_f)          //f(n) chua dc tinh
            {
                 if(i_f%2==0)
                             f[i_f]= f[i_f/2];
                 else    
                             f[i_f]= f[i_f/2]+f[i_f/2+1];                     
                 i_f++;
            }
    
            if(n%2==0) arr[i++]=f[n-1];
       	    else arr[i++]=f[n];
        } while(n!=0); 	
        
        for(int j=0;j<i-1;j++)
                cout<<arr[j]<<endl;
    	cin.get();
    	cin.get();
    	return 0;
    }
    Last edited by 09520500; 15-06-2011, 02:07. Reason: Thêm link đề bài tập
    Henry Nguyễn (Điệp Nguyễn MBA)
    --
    MBA, Sales Director, Co-founder - MYTH VIET NAM TECHNOLOGY CO., LTD - http://myth.vn/
    Email: diepnguyenmba@gmail.com - Phone: 0905.504.386

  • #2
    Originally posted by 09520500 View Post
    Nguồn: http://acm.timus.ru/problem.aspx?space=1&num=1079

    Bài này mình giải như sau nhưng không hiểu sai đâu?? Mọi người chỉ giáo nhé!
    Code:
    #include <iostream>
    using namespace std;
    
    int main()
    {
        long n,i=0,i_f=2;
        long arr[10], f[99999];
        f[0]=0; f[1]=1;
        do
        {
            cin>>n;
            while(n>=i_f)          //f(n) chua dc tinh
            {
                 if(i_f%2==0)
                             f[i_f]= f[i_f/2];
                 else    
                             f[i_f]= f[i_f/2]+f[i_f/2+1];                     
                 i_f++;
            }
    
            if(n%2==0) arr[i++]=f[n-1];
       	    else arr[i++]=f[n];
        } while(n!=0); 	
        
        for(int j=0;j<i-1;j++)
                cout<<arr[j]<<endl;
    	cin.get();
    	cin.get();
    	return 0;
    }
    Nó ý tưởng đi em, thảy cái cục code dài ngoằng mà không có comment này thì chả ma nào đọc cho đâu

    Comment


    • #3
      Vài chỗ chưa đúng:
      - i_f phải reset lại giá trị 2 mỗi vòng lặp while
      - Nên dùng biến Max để tìm giá trị lớn nhất, (hai giá trị cuối cùng không phải là lớn nhất, thử với n = 16).
      Last edited by 08520522; 15-06-2011, 20:04.
      Chưa....

      Comment


      • #4
        Originally posted by 08520522 View Post
        Vài chỗ chưa đúng:
        - i_f phải reset lại giá trị 2 mỗi vòng lặp while
        - Nên dùng biến Max để tìm giá trị lớn nhất, (hai giá trị cuối cùng không phải là lớn nhất, thử với n = 16).
        -> i_f ko cần phải reset lại vì chỉ cần tính f[i] 1 lần và lưu nó vào mảng rùi! Tính rùi ko cần tính lại
        Em phát hiện quy luật sai! cứ tưởng là 1 trong 2 số cuối là Max!
        Henry Nguyễn (Điệp Nguyễn MBA)
        --
        MBA, Sales Director, Co-founder - MYTH VIET NAM TECHNOLOGY CO., LTD - http://myth.vn/
        Email: diepnguyenmba@gmail.com - Phone: 0905.504.386

        Comment


        • #5
          Đây là bài em làm, có gì sai anh góp ý nha.
          PHP Code:
          #include <stdio.h>
          #include <stdlib.h>

          const char *INP="MAX.INP";
          const 
          char *OUT="MAX.OUT";

          int Maximum(int n);
          void QuickSort(int a[],int lint r);

          void QuickSort(int a[],int lint r)
          {
               
          int i,j,x,temp;
               
          i=l;
               
          j=r;
               
          x=a[(l+r)/2];
               do{
                            while(
          a[i]<xi++;
                            while(
          a[j]>xj--;
                            if(
          i<=j)
                            {
                                    
          temp=a[i];
                                    
          a[j]=a[i];
                                    
          a[j]=temp;
                                    
          i++;
                                    
          j--;
                            }
               }while(
          i<=j);
               if(
          l<jQuickSort(a,l,j);
               if(
          i<rQuickSort(a,i,r);
          }

          int Maximum(int n)
          {
              
          int a[100000];
              
          int i;
              
          a[0]=0;
              
          a[1]=1;
              for(
          i=1;i<=n/2+1;i++)
              {
                              
          a[2*i]=a[i];
                              
          a[2*i+1]=a[i]+a[i+1];
              }
              
          QuickSort(a,0,n);
              return 
          a[n];
          }
          void main()
          {
               
          int a[100000];
               
          int i,n=0;
               
          FILE *fi=fopen(INP,"r");
               do
               {
                    
          fscanf(fi,"%d",&a[n]);
                    if(
          a[n]<=0) break;
                    else 
          n++;
               }while(
          1);
               
          fclose(fi);
               
          FILE *fo=fopen(OUT,"w");
               for(
          i=0;i<n;i++) fprintf(fi,"%d\n",Maximum(a[i]));
               
          fclose(fo);

          Last edited by 10520180; 20-06-2011, 02:02.

          Comment


          • #6
            Đã thử submit code ở trên nhưng bị wrong test 5. Tác giả bên trên có submit chưa vậy.

            Comment


            • #7
              sau một đêm mày mò em mới phát hiện ra lỗi sai (chỗ QuickSort)
              Đây là code của em nó(Accepted):
              Code:
              #include <stdio.h>
              #include <stdlib.h>
              
              const char *INP="MAX.INP";
              const char *OUT="MAX.OUT";
              
              int Maximum(int n);
              void QuickSort(int a[],int l, int r);
              
              void QuickSort(int a[],int l, int r)
              {
                   int i,j,x,temp;
                   i=l;
                   j=r;
                   x=a[(l+r)/2];
                   do{
                                while(a[i]<x) i++;
                                while(a[j]>x) j--;
                                if(i<=j)
                                {
                                        temp=a[i];
                                        a[i]=a[j];
                                        a[j]=temp;
                                        i++;
                                        j--;
                                }
                   }while(i<=j);
                   if(l<j) QuickSort(a,l,j);
                   if(i<r) QuickSort(a,i,r);
              }
              
              int Maximum(int n)
              {
                  int a[100000];
                  int i;
                  a[0]=0;
                  a[1]=1;
                  for(i=1;i<n/2+1;i++)
                  {
                                  a[2*i]=a[i];
                                  a[2*i+1]=a[i]+a[i+1];
                  }
                  QuickSort(a,0,n);
                  return a[n];
              }
              void main()
              {
                   int a[100000];
                   int i,n=0;
                   FILE *fi=fopen(INP,"r");
                   do
                   {
                        fscanf(fi,"%d",&a[n]);
                        if(a[n]<=0) break;
                        else n++;
                   }while(1);
                   fclose(fi);
                   FILE *fo=fopen(OUT,"w");
                   for(i=0;i<n;i++) fprintf(fi,"%d\n",Maximum(a[i]));
                   fclose(fo);
              }

              Comment


              • #8
                Chúc mừng bạn trẻ. Có thể code ngắn hơn được không, bỏ phần QuickSort đi, tính Maximum 1 lần thôi.

                Comment


                • #9
                  nếu tìm max thì sẽ tốn thời gian hơn anh ah, nên dùng QuickSort nhanh hơn...em nghĩ zậy

                  Comment


                  • #10
                    Originally posted by 10520180 View Post
                    nếu tìm max thì sẽ tốn thời gian hơn anh ah, nên dùng QuickSort nhanh hơn...em nghĩ zậy
                    quick sort độ phức tạp trung bình O(n*log(n)) trong khi tìm max luôn là O(n). Hình như khóa 5 học cấu trúc dữ liệu và giải thuật rồi mà phải không :-?

                    Comment


                    • #11
                      keke, cái đó em nghỉ hehe, mong các anh thông cảm,...

                      Comment


                      • #12
                        anh An đúng ùi....một vòng for thui... cần chi sắp..

                        Comment


                        • #13
                          Originally posted by 07520004 View Post
                          quick sort độ phức tạp trung bình O(n*log(n)) trong khi tìm max luôn là O(n). Hình như khóa 5 học cấu trúc dữ liệu và giải thuật rồi mà phải không :-?
                          Bạn ý nói "...em nghĩ zậy" chắc là chưa học rồi. Hông bit bạn trẻ có hiểu ý mình ko ta. Dùng O(n) để duyệt dãy có hơi "cùi" nhưng hiệu quả (trong bài toán này).

                          Comment


                          • #14
                            à... các huynh ai có lời giải bài "Chia kẹo"hay "stone " mà không cần đệ quy và mãng đánh dấu.. share em với... em làm bằng mãng đánh dấu ...AC nhưng gần 2M ~~""!!

                            Comment


                            • #15
                              Originally posted by 10520516 View Post
                              à... các huynh ai có lời giải bài "Chia kẹo"hay "stone " mà không cần đệ quy và mãng đánh dấu.. share em với... em làm bằng mãng đánh dấu ...AC nhưng gần 2M ~~""!!
                              Post nó trong topic khác đi em, và chữ "mãng" chỉ xuất hiện trong từ "mãng xà" thôi em à

                              Comment

                              LHQC

                              Collapse
                              Working...
                              X