lsmCC 发表于 2024-1-18 09:50:34

为什么ans的值没有被修改

#include<bits/stdc++.h>
using namespace std;
// #define INF 0X3f3f3f3f
typedef long long ll;
ll s,n,m,ans=1e18;
vector<int>w,v,l,r;
vector<ll> sn,sv;
bool check(int W)
{
    sn.assign(n+1, 0);
    sv.assign(n+1, 0);
    for(int i=1;i<=n;i++)
    {
      if(w>=W)sn=sn+1,sv=sv+v;
      else sn=sn,sv=sv;
    }
    ll y=0;
    for(int i=1;i<=m;i++)
    {
      y+=(sn]-sn-1])*(sv]-sv-1]);
    }
    ans=min(ans,llabs(y-s));
    return y<=s; //w大那么y就小

}
ll find()
{
    // ll ans=0;
    int l=0,r=1e6+1;
    while(l+1<r)
    {
      ll mid=l+r>>1;
      if(check(mid))r=mid;
      else l=mid;
    }
    return ans;
   
}
int main()
{
    cin>>n>>m>>s;
    w.resize(n);
    v.resize(n);
    l.resize(m);
    r.resize(m);
    for(int i=0;i<n;i++)
    {
      cin>>w>>v;
    }
    for(int i=0;i<m;i++)
    {
      cin>>l>>r;
    }
    cout<<find()<<endl;

}

FishC 发表于 2024-1-18 09:51:46

在你的代码中,ans的值没有被修改是因为在check函数中,并没有对ans进行任何操作。在你的代码中,ans是一个全局变量,但是在check函数中并没有对其进行赋值或修改操作。

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

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

if(y < ans) {
    ans = y;
}

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

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

这是修改后的代码示例:

#include <iostream>
#include <vector>
using namespace std;

typedef long long ll;

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

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

    for(int i=1; i<=n; ++i) {
      if(w <= W) {
            sn = sn + 1;
            sv = sv + v;
      } else {
            sn = sn;
            sv = sv;
      }
    }

    ll y=0;
    for(int i=1; i<=m; ++i) {
      y += (sn] - sn-1]) * (sv] - sv-1]);
    }

    if(y < ans) {
      ans = y;
    }

    return y <= s;
}

int main()
{
    cin >> n >> m >> s;
    w.resize(n+1);
    v.resize(n+1);
    l.resize(m+1);
    r.resize(m+1);

    for(int i=1; i<=n; ++i) {
      cin >> w >> v;
    }

    for(int i=1; i<=m; ++i) {
      cin >> l >> r;
    }

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

      if(check(mid)) {
            right = mid;
      } else {
            left = mid + 1;
      }
    }

    cout << ans << endl;

    return 0;
}

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 为什么ans的值没有被修改