- 高镜铠 的博客
7.16
- @ 2024-7-16 17:53:09
TP3 小田喂猫
思路: 猫粮可以分成两个部分,第一个部分是在k天之内可以被吃完,第二个部分是在吃了k天后还有剩,或正好吃完,在他们之间有一个整数k,来分割他们两,我们要尽快找到他,找到之后再使用前缀和来计算区间和,最后将他们两加起来输出。 代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1e3;
long long sum1[N],sum2[N];
long long n,q;
long long k;
struct P
{
long long x;
long long y;
}a[N];
bool cmp(P a,P b)
{
return a.y<b.y;
}
int bs1()
{
int l=1,r=n,mid;
while(l<r)
{
mid=(l+r)>>1;
if(a[mid].y>=k) r=mid;
else l=mid+1;
}
if(a[l].y>=k) return l;
return n+1;
}
int main()
{
freopen("cat.in", "r", stdin);
freopen("cat.out", "w", stdout);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i].x;
for(int i=1;i<=n;i++) cin>>a[i].y;
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++) sum1[i]=sum1[i-1]+(a[i].x*a[i].y);
for(int i=1;i<=n;i++) sum2[i]=sum2[i-1]+a[i].x;
cin>>q;
while(q--)
{
cin>>k;
int idx=bs1();
cout<<sum1[idx-1]+(sum2[n]-sum2[idx-1])*k<<"\n";
}
return 0;
}
错误点: 1、没搞懂二分在干嘛,将两种情况弄反了。 2、排序写错了条件。