看到这道题,应该都能想到用二分,那问题是怎么去判定呢? 我们考虑用前缀和(a1统计w,a2统计v),枚举每个矿石,,当前判定的值是x,如果该矿石的w>=x,a1[i]=a1[i-1]+1,a2[i]=a2[i-1]+v[i]:反之直接等于上一个就行了. 枚举完后,按照题目给的公式,更新它与s差值绝对值的最小值,得到最终答案. #include<bits/stdc++.h> typedef long long LL; using namespace std; const int N=2e5…
题目大意: 额--貌似蛮清晰的,就不赘述了. 思路: 首先不难发现M越大Y越小,因此可以二分答案(方向不要弄错),二分出最小的不小于S的Y即可.而计算Y时可用前缀和O(n+m)求得.两种边界情况也要考虑一下(同时long long不要少开). 代码: #include<cstdio> #include<iostream> using namespace std; #define ll long long ; int n,m,i,h,t,k,mn,mx,mid,w[M],v[M],l…
题目描述 点进去看吧,说的不能再清楚了. Solution 看到数据规模不难想到二分 WWW,然后用个前缀和优化一下即可.注意上下界. #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; #define int long long const int MAXN=200010; int n,m,s; int maxx=-1,m…