鱼C论坛

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

为什么ans的值没有被修改

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

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

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

x
#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[i]>=W)sn[i]=sn[i]+1,sv[i]=sv[i-1]+v[i];
        else sn[i]=sn[i-1],sv[i]=sv[i-1];
    }
    ll y=0;
    for(int i=1;i<=m;i++)
    {
        y+=(sn[r[i]]-sn[l[i]-1])*(sv[r[i]]-sv[l[i]-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[i]>>v[i];
    }
    for(int i=0;i<m;i++)
    {
        cin>>l[i]>>r[i];
    }
    cout<<find()<<endl;

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

使用道具 举报

发表于 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[i] <= W) {
            sn[i] = sn[i-1] + 1;
            sv[i] = sv[i-1] + v[i];
        } else {
            sn[i] = sn[i-1];
            sv[i] = sv[i-1];
        }
    }

    ll y=0;
    for(int i=1; i<=m; ++i) {
        y += (sn[r[i]] - sn[l[i]-1]) * (sv[r[i]] - sv[l[i]-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[i] >> v[i];
    }

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

    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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-17 02:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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