Mọi người giúp mình xem bài 1263 - Elections mình làm sai ở đâu? Mình viết trên C#. Mình đã chạy đúng trên Visual Studio 2013, nhưng lại bị WA ngay test 1.

Cảm ơn mọi người.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//WA. Test 1
namespace _1263Elections
{
    class Program
    {
        static void Main(string[] args)
        {
            //Nhập n, m.
            string[] input = Console.ReadLine().Split(' ');
            int n = int.Parse(input[0]);
            int m = int.Parse(input[1]);

            int[] c = new int[n];
            int[] a = new int[m];
            //Nhập giá trị của từng ứng cử viên.
            for (int i = 0; i < m; i++)
                a[i] = int.Parse(Console.ReadLine());
            //Khởi tạo mảng đếm các ứng cử viên.
            for (int x = 0; x < n; x++)
                c[x] = 0;
            //Duyệt và đếm.
            for (int l = 0; l < n; l++)
                for (int j = 0; j < m; j++)
                    if ((l + 1) == a[j])
                        c[l]++;
            //In phần trăm của từng ứng cử viên.
            for (int k = 0; k < n; k++)
                Console.WriteLine(Math.Round((100.0*c[k] / m), 2)+'%');
        }
    }
}

 

Mình nghĩ là cái (100.0*c[k] / m) chuyển thành (100.0*c[k] / m) + eps với eps là một giá trị cực nhỏ

Trả lời RRclone1
  Hiện bài gốc

Em cảm ơn ạ, để em thử lại và đã phát hiện ra lỗi sai của em khi đã dùng Math.Round() sai cách. Chỉnh lại đã đúng 5 test đầu nhưng lại sai ở test 6. :(

Em có xem qua thảo luận và thấy mọi người bảo là điền 0 cho mảng c (em đã làm); có trường hợp bảo chỉnh size của c là 10000, nhưng em thử qua và cũng thấy vô ích. 

Mọi người tiếp tục giúp mình với. Cảm ơn mọi người.

Code đúng 5 test đầu:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//WA. Test 1
namespace _1263Elections
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] input = Console.ReadLine().Split(' ');
            int n = int.Parse(input[0]);
            int m = int.Parse(input[1]);

            int[] c = new int[n];
            int[] a = new int[m];
          
            for (int i = 0; i < m; i++)
                a[i] = int.Parse(Console.ReadLine());
        
            for (int x = 0; x < n; x++)
                c[x] = 0;
       
            for (int l = 0; l < n; l++)
                for (int j = 0; j < m; j++)
                    if ((l + 1) == a[j])
                        c[l]++;

            double result;
            for (int l = 0; l < n; l++)
            {
                result = 100.0 * c[l] / m;
                if (Math.Round(result, 2) - result == 0)
                    Console.WriteLine(Math.Round(result, 2) + ".00%");
                else
                    Console.WriteLine(Math.Round(result, 2) + "%");
            }
        }
    }
}

 

Trả lời ntthanhpy
  Hiện bài gốc

Mình không rõ bài này nhưng mà có lẽ bạn nên xài eps như anh RRClone nói?

Math.abs(Math.round(result, 2) - result) < eps

 

Trả lời RRclone1
  Hiện bài gốc

theo em hiểu đề thì là tính% bầu cử. thuật toán cộng thêm cái eps rất nhỏ để làm gì thế thế mn?

nếu e hiểu sai mong mọi người chỉ

Trả lời lecong
  Hiện bài gốc

Bạn có thể đọc bài viết này của Python nói về vấn đề độ chính xác khi làm việc với số thực. Bài viết dùng ngôn ngữ Python, nhưng những kiến thức này áp dụng cho tất cả các ngôn ngữ lập trình.

Còn cộng EPS là để giải quyết vấn đề độ chính xác này.