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、排序写错了条件。