Как T избежать усеченного целочисленного деления в этом коде? Мой отсортированный массив 1 1 1 1 1 1
, поэтому a [0] = 1 и a [n] должны быть 1/2 = 0,5.
int main()
{
long long n,w;
scanf("%lld %lld", &n, &w);
long long arr[2*n];
for(long long i = 0; i < 2 * n; i++)
{
scanf("%lld", &arr[i]);
}
sort(arr,arr+2*n);
long long a = arr[0];
long long b = (float)(arr[n]/2); // <--- this part of code
cout << " a is " << a << endl;
cout << " b is " << b << endl;
long long m = min(a,b);
cout << " m is " << m << endl;
long long and = min(m * n + m * 2LL * n, w);
printf("%lld", ans);
return 0;
}
b
переменная не может содержать число с плавающей запятой, так как это целое число. Не только ваше обращение в float
происходит слишком поздно, но вы сохраняете результат в целочисленной переменной. Как можно ожидать чего-то еще, кроме целочисленного результата?
float b = ((float)arr[n])/2.f;
Даст лучшие результаты.
Результат:
arr[n] / 2
является целочисленным выражением, так как оба операнда являются целыми числами. Следовательно, он выполняет целочисленное деление, и вы теряете необходимую точность. Преобразование (целочисленного) результата в float
потом не поможет, потому что точность просто не там.
Чтобы получить необходимую точность, сделайте оба операнда float
s перед делением:
float b = (float) arr[n] / 2.f;
Как избежать усеченного целочисленного деления в этом коде?
Масштабируйте значения на 2 и делите только на 2 в конце.
int main(void) {
long long n,w;
scanf("%lld %lld", &n, &w);
long long arr[2*n];
for(long long i = 0; i < 2 * n; i++)
{
scanf("%lld", &arr[i]);
}
sort(arr,arr+2*n);
long long a2 = arr[0]*2;
long long b2 = arr[n];printf("a*2 %lld\n", a2);
printf("b*2 %lld\n", b2);
long long m2 = min(a2,b2);
printf("m*2 %lld\n", m2);
long long ans2 = min(m2 * n + m2 * 2LL * n, w*2);
printf("ans*2 %lld\n", ans);
printf("ans %lld.%d\n", ans2/2, abs(ans%2)*5);
return 0;
}
Примечание: в C убедитесь, что long long min(long long a, long long b)
имеет эту подпись.