洛谷-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;
}
成功通过
似乎并不是最优解,挖坑等待以后回来填

浙公网安备 33010602011771号