Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: [ Solved ] [BT][Sắp xếp]

  1. #1
    Ngày gia nhập
    08 2006
    Nơi ở
    Hải Phòng
    Bài viết
    218

    Mặc định [ Solved ] [BT][Sắp xếp]

    Tổ chức tham quan

    Trong đợt tổ chức đi tham quan danh lam thắng cảnh của thành phố Hồ Chí Minh, Ban tổ chức hội thi Tin học trẻ tổ chức cho N đoàn (đánh từ số 1 đến N) mỗi đoàn đi thăm quan một địa điểm khác nhau. Đoàn thứ i đi thăm địa điểm ở cách Khách sạn Hoàng Đế di km (i=1,2,...., N). Hội thi có M xe taxi đánh số từ 1 đến M (M³N) để phục vụ việc đưa các đoàn đi thăm quan. Xe thứ j có mức tiêu thụ xăng là vj đơn vị thể tích/km.


    Yêu cầu: Hãy chọn N xe để phục vụ việc đưa các đoàn đi thăm quan, mỗi xe chỉ phục vụ một đoàn, sao cho tổng chi phí xăng cần sử dụng là ít nhất.


    Dữ liệu:File văn bản P2.INP:
    - Dòng đầu tiên chứa hai số nguyên dương N, M (N<=M<=200);
    - Dòng thứ hai chứa các số nguyên dương d1, d2, ..., dN;
    - Dòng thứ ba chứa các số nguyên dương v1, v2, ..., vM.
    - Các số trên cùng một dòng được ghi khác nhau bởi dấu trắng.


    Kết quả: Ghi ra file văn bản P2.OUT:
    - Dòng đầu tiên chứa tổng lượng xăng dầu cần dùng cho việc đưa các đoàn đi thăm quan (không tính lượt về);
    - Dòng thứ i trong số N dòng tiếp theo ghi chỉ số xe phục vụ đoàn i (i=1, 2, ..., N).
    Ví dụ:
    INPUT
    3 4
    7 5 9
    17 13 15 10

    OUTPUT
    256
    2
    3
    4




    Đã được chỉnh sửa lần cuối bởi hailoc12 : 26-09-2007 lúc 10:11 PM.

  2. #2
    Ngày gia nhập
    08 2006
    Nơi ở
    Hải Phòng
    Bài viết
    218

    Hướng dẫn thuật toán

    Trước khi đọc những hướng dẫn dưới đây, hãy đảm bảo bạn đã dành thời gian suy nghĩ về bài toán, tìm hiểu kĩ lưỡng về INPUT, OUTPUT của nó. Tốt nhất nên cầm bút trong tay và làm thử vài ví dụ để tìm hiểu quy luật của bài toán. Chắc chắn bạn sẽ nhận ra bài toán không quá phức tạp như bạn tưởng.


    Thuật toán:


    - Cần phải chứng minh điều sau: Để tổng chi phí sử dụng xăng là nhỏ nhất thì xe tốn ít xăng hơn phải đựơc giao cho đoàn xa hơn, xe tốn nhiều xăng hơn sẽ dược giao cho đoàn gần hơn. Chú ý, bài này cũng như trong rất nhiều bài, phương án tối ưu có thể định nghĩa là phương án mà không tồn tại một cách thay đổi nào trển phương án đấy mà cho kết quả nhỏ hơn ( hoặc lớn hơn ) kết quả hiện tại của phương án.
    - Từ nhận định trên ta có thuật toán đơn giản sau:


    1. sắp xếp giảm các đoàn theo khoảng cách
    2. sắp xếp tăng các xe theo lượng xăng tiêu thụ
    3. sau đó gán xe thứ i cho đoàn thứ i. Ta được kết quả tối ưu.

    Và điều quan trọng cuối cùng, để thực sự hiểu được bài toán, các bạn phải bắt tay vào VIẾT CHƯƠNG TRÌNH.


    Chúc vui !

  3. #3
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    cho anh hỏi HaiLoc bài này hình như đề bài chưa đủ thì phải, nói đúng hơn là hơi gò bó quá?
    Hãy chọn N xe để phục vụ việc đưa các đoàn đi thăm quan, mỗi xe chỉ phục vụ một đoàn, sao cho tổng chi phí xăng cần sử dụng là ít nhất.
    Giả sử xe thứ j (V[j], j = 1,2,3...M ) chạy được j km và tốn V[j] lít xăng thì giả sử đoàn thứ i đi thăm cách khách sạn d[i] km thì nếu 1 xe chỉ phục vụ 1 đoàn thì không nhất thiết phải "đi đúng số km" mà chỉ cần đi đủ ( hoặc dư ) số km thôi à ?

  4. #4
    Ngày gia nhập
    08 2006
    Nơi ở
    Hải Phòng
    Bài viết
    218

    Anh chú ý đề bài, xe thứ j có thể chạy số km bất kì và mỗi km sẽ tốn một lượng xăng là vj. Vì thế bài toán đơn thuần chỉ là sắp xếp. Nếu đưa thêm giới hạn xe thứ j chỉ có thể đi được dj km thì bài toán sẽ phức tạp hơn. Em cũng chưa thử nghĩ tới trường hợp này.

  5. #5
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Dựa theo ý tưởng của em, anh có cách giải như sau :
    -Sắp xếp lại xe tốn nhiều xăng hơn.
    -Đoàn đi xa hơn.
    Sau đó ghép vào, đây là toàn bộ code, em có cách nào hay hơn thì post cho anh tham khảo nhé ! Thân !
    C++ Code:
    1. #include <iostream>
    2. #include <iomanip>
    3.  
    4. const int maxx = 1000;
    5.  
    6. int Gasoline[maxx];
    7. int Distance[maxx];
    8. int subG[maxx], indexG[maxx];
    9. int subD[maxx], indexD[maxx];
    10.  
    11. int N; /*the number of touring-group*/
    12. int M; /*the number of bus */
    13.  
    14.   void swap ( int *r, int *c )
    15.    
    16.     {
    17.         int temp = *r;
    18.         *r = *c;
    19.         *c = temp;
    20. }
    21.   bool ascending ( int a, int b )  { return b < a; }
    22.   bool descending ( int a, int b ) { return b > a; }
    23.  
    24.   void bubble ( int array[], int size, bool (*compare)(int, int ) )
    25.  
    26.       {
    27.         for ( int i = 2; i <= size; i++ )
    28.                 for ( int j = 1; j <= size-1; j++ )
    29.                         if ( (*compare) (array[j], array[j+1]) )
    30.                         {
    31.                                 swap ( &array[j], &array[j+1] );
    32.                         }        
    33. }
    34.  
    35.   void InputData()
    36.  
    37.     {
    38.        
    39.         cout << "Enter the number of group : " ;
    40.         cin >> N;
    41.         cout << "Enter the number of bus : ";
    42.         cin >> M;
    43.  
    44.         cout << "----------------" << endl;
    45.  
    46.         for ( int i = 1; i <= M; i++ )
    47.         {
    48.                 cout << "The bus : "<< i << " cost : ";
    49.                 cin >> Gasoline[i];
    50.                 subG[i] = Gasoline[i];
    51.         }
    52.         for ( int i = 1; i <= N; i++ )
    53.         {
    54.                 cout << "The group : "<< i << " distance : ";
    55.                 cin >> Distance[i];
    56.                 subD[i] = Distance[i];
    57.         }
    58.         /*luu giu index*/
    59.         for ( int i = 1; i <= M; i++ )
    60.         {
    61.                 indexD[i] = i;
    62.                 indexG[i] = i;
    63.         }
    64. }
    65.  
    66.       /*Sort data follow order the car cost more gas serve the longer distance*/
    67.   void SortData()
    68.    
    69.     {
    70.          
    71.         cout << endl << "-------------------------" << endl;
    72.         bubble ( subG, M, ascending );
    73.         bubble ( subD, N, descending);
    74.        
    75. }
    76.  
    77.   void Process()
    78.  
    79.     {
    80.  
    81.         int sum = 0;
    82.         for ( int i = 1; i <= N; i++ )
    83.         {
    84.                 sum = sum + subD[i]*subG[i];
    85.         }
    86.      
    87.         cout << "The total gasoline consumed : " << sum;
    88.         cout << endl;
    89.        
    90.        
    91.         /*Search for former index*/
    92.         int index_Gas = 1;
    93.         for ( int i = 1; i <= M; i++ )
    94.         {
    95.                 for ( int j = 1; j <= M; j++ )
    96.                 {
    97.                         if ( subG[i] == Gasoline[j] )
    98.                         {
    99.                                 indexG[index_Gas] = j;
    100.                                 index_Gas++;
    101.                         }
    102.                 }
    103.         }
    104.        
    105.         int index_Dis = 1;
    106.         for ( int i = 1; i <= N; i++ )
    107.         {
    108.                 for ( int j = 1; j <= N; j++ )
    109.                 {
    110.                         if ( subD[i] == Distance[j] )
    111.                         {
    112.                                 indexD[index_Dis] = j;
    113.                                 index_Dis++;
    114.                         }
    115.                 }
    116.         }
    117.         /******************************************/
    118.        
    119. }
    120. void OutPut()
    121.  
    122.     {
    123.         for ( int i = 1; i <= N; i++ )
    124.         {
    125.                 cout << "The bus [" << indexG[i] << "]";
    126.                 cout << " serves the group [" << indexD[i] << "]";
    127.                 cout << endl;
    128.         }
    129. }
    130.        
    131. void main()
    132.  
    133.     {
    134.    
    135.     InputData();
    136.     SortData();
    137.     Process();
    138.     OutPut();
    139.    
    140.     cin.get();
    141. }
    Đã được chỉnh sửa lần cuối bởi rox_rook : 02-03-2008 lúc 02:56 AM.

Các đề tài tương tự

  1. [ Solved ]Xây dựng lớp ĐỒTHI
    Gửi bởi bluesky_123078 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 09-11-2008, 09:34 AM
  2. [Solved] Hỏi về con trỏ
    Gửi bởi RedHatLinux9 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 17-09-2008, 08:01 AM
  3. [ Solved ]Cấp phát động
    Gửi bởi demontaihack trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 16
    Bài viết cuối: 07-09-2008, 08:23 PM
  4. [ Solved ]Cần hướng dẫn về bài tập màng!!
    Gửi bởi itthuyloi trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 03-06-2008, 03:00 PM
  5. [ Solved ]Sắp xếp hai dãy số
    Gửi bởi thuchanh trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 10
    Bài viết cuối: 20-04-2008, 11:47 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn