日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

近似乘积(jzoj 3925)

發(fā)布時(shí)間:2023/12/3 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 近似乘积(jzoj 3925) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

近似乘積

jzoj 3925

題目大意

給你一個(gè)集合A和n讓你求不在集合A內(nèi)的x、y、z,使∣n?x×y×z∣|n-x×y×z|n?x×y×z最小

輸入樣例

3 2 2 4 4 1 1 7 2 1 15 90

輸出樣例

1 1 3 2 2 2 2 5 9

數(shù)據(jù)范圍

40% 的數(shù)據(jù):1?m?10,1?n?100.1 \leqslant m\leqslant 10,1 \leqslant n \leqslant 100.1?m?101?n?100.
70% 的數(shù)據(jù):1?m,n?1000.1 \leqslant m, n \leqslant 1000.1?m,n?1000.
100% 的數(shù)據(jù):1?m,n,Ai?106,1?T?4.1 \leqslant m, n, Ai \leqslant 10^6,1 \leqslant T \leqslant 4.1?m,n,Ai?1061?T?4.

解題思路

我們可以直接枚舉x和y然后z用n除x和y來求
我們保證x×y小于n
因?yàn)閤×y大于n,那x×y×z-n就大于x×x×z-n了(x<y)
如果x=y且x×x>n那在外面在判斷一次就行了(具體看代碼)

代碼

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long using namespace std; ll t, n, m, w, x, y, z1, z2, ans, ansa, ansb, ansc, next, last, p[2000500], a[2000500], nx[2000500], ls[2000500]; int main() {scanf("%lld", &t);while(t--){memset(p, 0, sizeof(p));w = 0;scanf("%lld", &m);for (ll i = 1; i <= m; ++i){scanf("%lld", &x);p[x] = 1;//不能選}scanf("%lld", &n);for (ll i = 1; i <= n; ++i){if (!p[i]) a[++w] = i, last = i;//a是n之內(nèi)能選的ls[i] = last;//上一個(gè)可以選的}if (!w) a[1] = 2000010;for (ll i = n * 2 + 10; i > 0; --i){if (!p[i]){next = i;if (!w) a[1] = min(a[1], i);//如果n之內(nèi)沒有能選的就選一個(gè)最小的n之外的能選的}nx[i] = next;//下一個(gè)能選的}if (!w) w = 1;ans = (n * 2 + 10) * (n * 2 + 10) * (n * 2 + 10);for (ll i = 1; i <= w; ++i)for (ll j = i; i * j <= w; ++j){x = a[i];y = a[j];z1 = ls[n / (x * y)];//往左對齊z2 = nx[n / (x * y) + 1];//往右對齊if (z1 > 0 && !p[z1] && abs(n - x * y * z1) <= ans)//z可以選,且更優(yōu){if (abs(n - x * y * z1) < ans || x < ansa || x == ansa && y < ansb || x == ansa && y == ansb && z1 < ansc)//ans更優(yōu)或答案更優(yōu){ansa = x;ansb = y;ansc = z1;}ans = abs(n - x * y * z1);}if (z2 > 0 && !p[z2] && abs(n - x * y * z2) <= ans)//同上{if (abs(n - x * y * z2) < ans || x < ansa || x == ansa && y < ansb || x == ansa && y == ansb && z2 < ansc){ansa = x;ansb = y;ansc = z2;}ans = abs(n - x * y * z2);}}if (abs(n - a[1] * a[1] * a[1]) <= ans)//保證有答案{if (abs(n - a[1] * a[1] * a[1]) < ans || a[1] < ansa || a[1] == ansa && a[1] < ansb || a[1] == ansa && a[1] == ansb && a[1] < ansc){ansa = a[1];ansb = a[1];ansc = a[1];}ans = abs(n - a[1] * a[1] * a[1]);}printf("%d %d %d\n", ansa, ansb, ansc);}return 0; }

總結(jié)

以上是生活随笔為你收集整理的近似乘积(jzoj 3925)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。