Live2D

洛谷-P2695 骑士的工作

题目知识点:双指针(真的吗)

没有特殊标识的是作答时思路,不能保证正确

题意

\(n\) 个目标每个目标有一个难度值 \(n_{i}\) 。有 \(k\) 个人,每一个人可以解决 至多 一个不大于 \(z_{i}\) 的目标然后需要收取 \(z_{i}\) 。求最小花费。

思路

第一眼思路将 \(n\)\(z\) 从小到大排序,从小的开始一个一个进行比较,差点忘记sort的默认排序,废话不多说上代码:

非满分做法

#include<bits/stdc++.h>
using namespace std;

const int N=2e4+10;

int n,m;
int a[N],z[N];
int ans;

int main()
{
    cin>>n>>m;

    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    for(int i=1;i<=m;i++)
    {
        cin>>z[i];
    }

    sort(a+1,a+n+1);
    sort(z+1,z+m+1);

    if(n>m)
    {
        cout<<"you died!";
        return 0;
    }

    int cnt=1;

    for(int i=1;i<=m;)
    {
        if(cnt>n)
        {
            cnt--;
            break;
        }
        if(z[i]>=a[cnt])
        {
            cnt++;
            ans+=z[i];
            i++;
        }
        else
        {
            i++;
        }
    }

    if(cnt!=n)cout<<"you died!";
    else cout<<ans;

    return 0;
}

并没有满分,只拿了80分,开始思考原因:
发现cnt标记有误更改后:

#include<bits/stdc++.h>
using namespace std;

const int N=2e4+10;

int n,m;
int a[N], z[N];

int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=m;i++) cin>>z[i];

    sort(a+1,a+n+1);
    sort(z+1,z+m+1);

    if(n>m) { cout<<"you died!"; return 0; }

    int ans=0, idx=1; // idx 指向当前待砍的头
    for(int i=1; i<=m && idx<=n; i++)
        if(z[i] >= a[idx])
        {
            ans += z[i];
            idx++;
        }

    if(idx > n) cout << ans;
    else cout << "you died!";

    return 0;
}

成功通过

似乎并不是最优解,挖坑等待以后回来填

posted @ 2026-08-24 22:56  小王小王i  阅读(9)  评论(0)    收藏  举报
Live2D