经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
cf1090 I.Minimal Product(贪心)
来源:cnblogs  作者:自为风月马前卒  时间:2018/12/11 9:29:38  对本文有异议

题意

题目链接

给出长度为\(n\)的序列\(a\),序列中的元素取值为\([-2e9, 2e9]\)

找到两个位置\((i, j) (i <j, a[i] < a[j])\),最小化\(a[i] * a[j]\)

Sol

当时在做的时候思路是直接维护大于\(0\)的最大/最小值,小于\(0\)的最大/最小值然从这四个里面转移

然而是有反例的,比如\(-100, -3, -5, -4\)

当时没有仔细往下想。

出现错误的本质原因还是因为负负的正的性质。

那么我们直接来分类讨论一下

整个序列可以分成四种情况

  • 全为正

这时候直接维护出前缀最小值

  • 存在一个位置为正数且前面有负数

同样维护前缀最小值

  • 前一半为正后一半为负

可分成两段分别做

  • 全为负

这是我自己没想出来的,看了dyh的代码只能Orzzz

这时候我们倒着考虑,不难发现一个小于\(0\)的数,乘上小于\(0\)的最大的数,得到的数一定是最小的。

那么直接维护一下最大值就好了。

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. //#define int long long
  4. #define uint unsigned int
  5. #define chmax(a, b) (a = (a > b ? a : b))
  6. #define chmin(a, b) (a = (a < b ? a : b))
  7. using namespace std;
  8. const int MAXN = 1e7 + 10;
  9. LL mod = 1ll << 32, INF = 9223372036854775806;
  10. inline LL read() {
  11. char c = getchar(); LL x = 0, f = 1;
  12. while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
  13. while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
  14. return x * f;
  15. }
  16. int N;
  17. LL L, R, X, Y, Z, a[MAXN];
  18. uint b[MAXN];
  19. LL add(LL x, LL y) {
  20. if(x + y < 0) return x + y + mod;
  21. return x + y >= mod ? x + y - mod : x + y;
  22. }
  23. LL mul(LL x, LL y) {
  24. return 1ll * x * y % mod;
  25. }
  26. void solve() {
  27. N = read();
  28. L = read(); R = read(); X = read(); Y = read(); Z = read(); b[1] = read(); b[2] = read();
  29. for(int i = 3; i <= N; i++) b[i] = (b[i - 2] * X % mod + b[i - 1] * Y % mod + Z) % mod;
  30. for(int i = 1; i <= N; i++) a[i] = b[i] % (R - L + 1) + L;
  31. //puts("");for(int i = 1; i <= N; i++) printf("%d ", a[i]);
  32. //'for(int i = 1; i <= N; i++) a[i] = read();
  33. LL mn = INF, ans = INF;
  34. //cout << ans << endl;
  35. for(int i = 1; i <= N; i++) {
  36. if(mn < a[i]) chmin(ans, mn * a[i]);
  37. chmin(mn, a[i]);
  38. }
  39. mn = -INF;
  40. for(int i = N; i >= 1; i--) {
  41. if(a[i] < mn) chmin(ans, mn * a[i]);
  42. chmax(mn, a[i]);
  43. }
  44. if(ans == INF) printf("IMPOSSIBLE\n");
  45. else cout << ans << endl;
  46. }
  47. signed main() {
  48. for(int T = read(); T; T--, solve());
  49. return 0;
  50. }
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号