鱼C论坛

 找回密码
 立即注册
查看: 198|回复: 1

为什么ans的值没有被修改

[复制链接]
发表于 2024-1-18 09:50:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. // #define INF 0X3f3f3f3f
  4. typedef long long ll;
  5. ll s,n,m,ans=1e18;
  6. vector<int>w,v,l,r;
  7. vector<ll> sn,sv;
  8. bool check(int W)
  9. {
  10.     sn.assign(n+1, 0);
  11.     sv.assign(n+1, 0);
  12.     for(int i=1;i<=n;i++)
  13.     {
  14.         if(w[i]>=W)sn[i]=sn[i]+1,sv[i]=sv[i-1]+v[i];
  15.         else sn[i]=sn[i-1],sv[i]=sv[i-1];
  16.     }
  17.     ll y=0;
  18.     for(int i=1;i<=m;i++)
  19.     {
  20.         y+=(sn[r[i]]-sn[l[i]-1])*(sv[r[i]]-sv[l[i]-1]);
  21.     }
  22.     ans=min(ans,llabs(y-s));
  23.     return y<=s; //w大那么y就小

  24. }
  25. ll find()
  26. {
  27.     // ll ans=0;
  28.     int l=0,r=1e6+1;
  29.     while(l+1<r)
  30.     {
  31.         ll mid=l+r>>1;
  32.         if(check(mid))r=mid;
  33.         else l=mid;
  34.     }
  35.     return ans;
  36.    
  37. }
  38. int main()
  39. {
  40.     cin>>n>>m>>s;
  41.     w.resize(n);
  42.     v.resize(n);
  43.     l.resize(m);
  44.     r.resize(m);
  45.     for(int i=0;i<n;i++)
  46.     {
  47.         cin>>w[i]>>v[i];
  48.     }
  49.     for(int i=0;i<m;i++)
  50.     {
  51.         cin>>l[i]>>r[i];
  52.     }
  53.     cout<<find()<<endl;

  54. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-18 09:51:46 | 显示全部楼层
在你的代码中,ans的值没有被修改是因为在check函数中,并没有对ans进行任何操作。在你的代码中,ans是一个全局变量,但是在check函数中并没有对其进行赋值或修改操作。

要修改ans的值,你可以在check函数中加入对ans的操作。根据你的需求,你可以在循环中将ans与当前计算得到的y进行比较,如果y更小,则更新ans的值。

例如,你可以在check函数的最后加入以下操作来修改ans的值:

  1. if(y < ans) {
  2.     ans = y;
  3. }
复制代码


这样,当满足条件时,ans的值就会被更新为更小的y的值。

请注意,为了能够正确地编译和运行你的代码,你需要包含一些必要的头文件,如vector和iostream。另外,在使用命名空间std之前,你还需要添加"using namespace std;"

这是修改后的代码示例:

  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;

  4. typedef long long ll;

  5. ll s,n,m,ans=1e18;
  6. vector<int> w,v,l,r;
  7. vector<int> sn,sv;

  8. bool check(int W)
  9. {
  10.     sn.assign(n+1, 0);
  11.     sv.assign(n+1, 0);

  12.     for(int i=1; i<=n; ++i) {
  13.         if(w[i] <= W) {
  14.             sn[i] = sn[i-1] + 1;
  15.             sv[i] = sv[i-1] + v[i];
  16.         } else {
  17.             sn[i] = sn[i-1];
  18.             sv[i] = sv[i-1];
  19.         }
  20.     }

  21.     ll y=0;
  22.     for(int i=1; i<=m; ++i) {
  23.         y += (sn[r[i]] - sn[l[i]-1]) * (sv[r[i]] - sv[l[i]-1]);
  24.     }

  25.     if(y < ans) {
  26.         ans = y;
  27.     }

  28.     return y <= s;
  29. }

  30. int main()
  31. {
  32.     cin >> n >> m >> s;
  33.     w.resize(n+1);
  34.     v.resize(n+1);
  35.     l.resize(m+1);
  36.     r.resize(m+1);

  37.     for(int i=1; i<=n; ++i) {
  38.         cin >> w[i] >> v[i];
  39.     }

  40.     for(int i=1; i<=m; ++i) {
  41.         cin >> l[i] >> r[i];
  42.     }

  43.     int left = 0, right = 1e9;
  44.     while(left < right) {
  45.         int mid = (left + right) / 2;

  46.         if(check(mid)) {
  47.             right = mid;
  48.         } else {
  49.             left = mid + 1;
  50.         }
  51.     }

  52.     cout << ans << endl;

  53.     return 0;
  54. }
复制代码


希望以上解答能够帮助到你!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 12:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表