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

Đề tài: Một bài trên spoj vn - các thùng nước, kết quả làm sai nhưng không biết sai chỗ nào?

  1. #1
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    434

    Mặc định Một bài trên spoj vn - các thùng nước, kết quả làm sai nhưng không biết sai chỗ nào?

    IOIBIN - Các thùng nước
    Có N thùng nước được đánh số từ 1 đến N, giữa 2 thùng bất kỳ đều có một ống nối có một van có thể khóa hoặc mở. Ở trạng thái ban đầu tất cả các van đều đóng.

    Bạn được cho một số yêu cầu, trong đó mỗi yêu cầu có 2 dạng:

    Dạng X Y 1 có ý nghĩa là bạn cần mở van nối giữa 2 thùng X và Y.

    Dạng X Y 2 có ý nghĩa là bạn cần cho biết với trạng thái các van đang mở / khóa như hiện tại thì 2 thùng X và Y có thuộc cùng một nhóm bình thông nhau hay không? Hai thùng được coi là thuộc cùng một nhóm bình thông nhau nếu nước từ bình nàycó thể chảy đến được bình kia qua một số ống có van đang mở.

    Input
    Dòng đầu tiên ghi một số nguyên dương P là số yêu cầu.

    Trong P dòng tiếp theo, mỗi dòng ghi ba số nguyên dương X, Y, Z với ý nghĩa có yêu cầu loại Z với 2 thùng X và Y.

    Output
    Với mỗi yêu cầu dạng X Y 2 (với Z = 2) bạn cần ghi ra số 0 hoặc 1 trên 1 dòng tùy thuộc 2 thùng X và Y không thuộc hoặc thuộc cùng một nhóm bình.

    Example
    Input:
    9
    1 2 2
    1 2 1
    3 7 2
    2 3 1
    1 3 2
    2 4 2
    1 4 1
    3 4 2
    1 7 2

    Output:
    0
    0
    1
    0
    1
    0
    Giới hạn
    1 ≤ N ≤ 10000
    1 ≤ P ≤ 50000

    Code của mình như sau, cho kết quả sai ở test thứ 10
    C++ Code:
    1. #include <iostream>
    2. #include <stdexcept>
    3. //#include <string>
    4. using namespace std;
    5.  
    6. int thung[10000];
    7. //khởi tạo tất cả các thùng có giá trị khác nhau
    8. void khoiTao()
    9. {
    10.     int i=0;
    11.     while(i<10000)
    12.     {
    13.         thung[i]=i;
    14.         i++;
    15.     }
    16. }
    17. //được gọi khi có yêu cầu mở đường ống giữa 2 thùng
    18. void noiThung(int i, int j)
    19. {
    20.     i--;
    21.     j--;
    22.     if(thung[i]!=thung[j])
    23.     {
    24.                 //cập nhật tất cả các thùng có giá trị thùng[j] sang giá trị thùng[i]
    25.         int k=0;
    26.         while(k<10000)
    27.         {
    28.             if(thung[k]==thung[j])
    29.             {
    30.                 thung[k]=thung[i];
    31.             }
    32.             k++;
    33.         }
    34.     }
    35. }
    36. //nếu giá trị 2 thùng như nhau cho '1' nếu không cho '0'
    37. char thungThongNhau(int i, int j)
    38. {
    39.     i--;
    40.     j--;
    41.     if(thung[i]==thung[j]) return '1';
    42.     else return '0';
    43. }
    44. int main()
    45. {
    46.     khoiTao();
    47.     long n;
    48.     cin>>n;
    49.     long i=0;
    50.     int x, y, z;
    51.     while(i<n)
    52.     {
    53.         cin>>x>>y>>z;
    54.         if(z!=1&&z!=2) throw invalid_argument("z la");
    55.        
    56.         if(z==1) noiThung(x,y);
    57.         else
    58.         {
    59.             cout<<thungThongNhau(x,y)<<endl;
    60.         }
    61.         i++;
    62.     }
    63.     getchar();
    64. }
    Các bạn có ý kiến gì không?

  2. #2
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    554

    Bạn thêm dòng này vào hàm noiThung, ở trước vòng while:
    Code:
    int const thung_j = thung[j];
    và thay dòng này:
    Code:
    if(thung[k]==thung[j])
    bằng dòng này
    Code:
    if(thung[k]==thung_j)
    rồi thử lại xem.

    Xem thêm: http://diendan.congdongcviet.com/threads/t400899::thay-the-trong-mang-2-chieu.cpp?p=911513#post911513
    Đã được chỉnh sửa lần cuối bởi Ada : 28-05-2019 lúc 06:00 AM.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  3. #3
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    434

    Trích dẫn Nguyên bản được gửi bởi Ada Xem bài viết
    Bạn thêm dòng này vào hàm noiThung, ở trước vòng while:
    Code:
    int const thung_j = thung[j];
    và thay dòng này:
    Code:
    if(thung[k]==thung[j])
    bằng dòng này
    Code:
    if(thung[k]==thung_j)
    rồi thử lại xem.

    Xem thêm: http://diendan.congdongcviet.com/threads/t400899::thay-the-trong-mang-2-chieu.cpp?=911513#post911513
    Cách của bạn đúng rồi! Mình sơ suất quá, cứ đinh ninh thung[j] là không đổi
    Cảm ơn bạn nhiều

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