cpp
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e5+10;
int a[N],b[N];
void solve()
{
int n,p;
cin>>n>>p;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<n;i++)
cin>>b[i];
vector<pair<int,int>> segs(n);
for(int i=0;i<n;i++)
segs[i].second=a[i],segs[i].first=b[i];
sort(segs.begin(),segs.end());
LL ans=0;
LL price=0;
for(auto e:segs)
if(e.first<p)
{
ans+=e.second;
ans+=1;
price+=p;
price+=(LL)e.first*e.second;
if(ans>=n)
break;
}
if(n>=ans)
price+=(n-ans)*(LL)p;
if(n==1)
price=p;
cout<<price<<endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin>>t;
while(t--)
solve();
return 0;
}
感觉题目做的太少了,pair
之类的双关键词的使用不是很熟练
cpp
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e5+10;
int a[N],b[N];
void solve()
{
int n,p;
cin>>n>>p;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<n;i++)
cin>>b[i];
vector<pair<int,int>> segs(n);
for(int i=0;i<n;i++)
segs[i].second=a[i],segs[i].first=b[i];
sort(segs.begin(),segs.end());
LL ans=0;
LL price=0;
ans+=1;
price+=p;
if(ans<n)
{
ans+=segs[0].second;
price+=segs[0].first*(LL)segs[0].second;
}
for(int i=1;i<n;i++)
{
if(segs[i].first<p)
{
if(ans>=n)
break;
ans+=segs[i].second;
price+=segs[i].first*(LL)segs[i].second;
}
}
if(n>=ans)
price+=(n-ans)*(LL)p;
cout<<price<<endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin>>t;
while(t--)
solve();
return 0;
}
哭了,改成这样子也过不了,准备看题解了,其实我是写过一个和这个很像的题的,但是那个题暴力可以做
官方题解感觉是把题意解释了一遍,水平太高了,我有点看不懂
看了一份别人提交的代码,感觉自己其实只差临门一脚(?)看似差一点点,其实差一个银河系(狗头)
cpp
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
void solve()
{
int n,p;
cin>>n>>p;
vector<pair<int,int>> mp(n);
for(int i=0;i<n;i++)
cin>>mp[i].second;
for(int i=0;i<n;i++)
cin>>mp[i].first;
sort(mp.begin(),mp.end());
int remain=n-1;
LL ans=p;
for(int i=0;i<n;i++)
{
if(remain<=0)
break;
if(mp[i].second>=remain)
{
ans+=min(remain*(LL)p,remain*(LL)mp[i].first);
break;
}
else
{
ans+=min((LL)mp[i].second*p,(LL)mp[i].second*mp[i].first);
remain-=mp[i].second;
}
}
cout<<ans<<endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin>>t;
while(t--)
solve();
return 0;
}
需要考虑一些细节问题,首先是把两个关键词读进去,因为要按照b
排序,所以把b
放在第一个关键词的位置,要是不这样,要另外写一个比较函数,重载小于号
然后是首先必须要通知一个居民
所以剩下n-1
个居民需要被通知,花费p
元,这是不可避免的消耗
然后开始循环,如果所有居民都被通知完了就跳出循环即可
在循环之前要按照第一个关键词排序,因为我们要尽可能地少花钱
如果遍历到的居民可以通知完剩下的所有居民,就更新答案,贪心策略更新答案,然后跳出循环,不够的话,也是更新答案,更新剩余的居民的数目,注意这里有两个整型数的乘法,会超出数据范围,要使用long long
回过头来看也不是很难,主要还是自己要多练