SDUT 2021 Spring Individual Contest(for 20) - 10 补题

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;
}

猜你喜欢

转载自blog.csdn.net/weixin_51768569/article/details/115308569