B题Minimal Area
题意:给你一个严格多边形面积的每一个点,让你求任意三个点组成的三角形的面积的最小值
思路:由题意知道相邻三个点组成的三角形面积最小,因此我们遍历所有的可能求得最小值,已知三个点求三角形面积公式为S = 1/2 * |(x2 - x1) * (y3-y1) - (y2 - y1) * (x3 - x1)|
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
#define inf 0x3f3f3f3f3f3f3f3f
struct node {
ll x,y;
}s[N];
int main()
{
ll n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>s[i].x>>s[i].y;
}
ll ans=inf;
for(int i=0;i<n;i++)
{
ll x1=s[(i-1+n)%n].x-s[(i-2+n)%n].x;
ll y1=s[(i-1+n)%n].y-s[(i-2+n)%n].y;
ll x2=s[i].x-s[(i-1+n)%n].x;
ll y2=s[i].y-s[(i-1+n)%n].y;
ll now=abs(x1*y2-x2*y1);
ans=min(ans,now);
}
cout<<ans<<endl;
return 0;
}
k题Video Reviews
题意:有n个人(带顺序),对i,如果前面有ai个人加入,那么i会加入你可以强迫任何一个人加入,问想要加入人数达到m的最小强迫次数为多少
思路:二分+贪心。要强迫首先强迫前面的人,因为前面的人被强迫后会对后面的人做出贡献,这样可以保证最优解,再用二分判断是否符合条件,最后答案和m取最小值
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
int a[N];
int n,m;
bool check(int k)
{
int ans=0;
for(int i=0;i<n;i++)
{
if(a[i]<=ans)
ans++;
else if(k)
{
ans++;
k--;
}
if(ans==m)
return true;
}
return false;
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
cin>>a[i];
int l=0;
int r=m;
int ans;
while(l<=r)
{
int mid=l+r>>1;
if(check(mid))
{
r=mid-1;
ans=mid;
}
else
{
l=mid+1;
}
}
cout<<min(m,ans)<<endl;
return 0;
}