牛客寒假算法基础集训营2 A:处女座的签到题(排序)+C:处女座的砝码(思维)+J:处女座的期末复习(贪心)

【题A】

处女座的签到题

【题解】

由于题目条件,x,y坐标的绝对值均在1e9以下,面积可能会到达1e18,所以无法用double储存。三角形的面积等于相邻两边叉积的一半,所以三角形面积的两倍一定是整数,我们可以用long long来储存,最后特判输出”.00”或”.50”。
对于找第k大,时间复杂度为O(n),可以利用nth_element。

nth_element()函数(取容器中的第n大值)

头文件:#include<algorithm>

作用:nth_element作用为求第n大的元素,并把它放在第n位置上,下标是从0开始计数的,也就是说求第0小的元素就是最小的数。

注意:nth_element()函数不过将第n大的数排好了位置,并不返回值。

【代码】

#include <bits/stdc++.h>
using namespace std;
#define ll long long
struct p{
    ll x,y;
}f[85];
int main()
{
    int t; scanf("%d",&t);
    while(t--)
    {
        int n,k; scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++) scanf("%lld%lld",&f[i].x,&f[i].y);
        vector <ll> v;
        for(int i=1;i<=n;i++)
            for(int j=i+1;j<=n;j++)
                for(int k=j+1;k<=n;k++)
                {
                    ll area=abs((f[j].x-f[i].x)*(f[k].y-f[i].y)-(f[k].x-f[i].x)*(f[j].y-f[i].y));
                    v.push_back(area);
                }
        nth_element(v.begin(),v.begin()+v.size()-k,v.end());
        ll ans=v[v.size()-k];
        if (ans%2==0) printf("%lld.00\n",ans/2);
        else printf("%lld.50\n",ans/2);
    }
    return 0;
}

【题C】

处女座的砝码

【题解】

对于每个砝码,可以选择放左边、不放、放右边三种情况,所以可以按三进制进行排列即可。

选择砝码如下:1,3,9,27,…选m个数最多能称出的重量为:$\displaystyle\sum_{i=0}^{m-1} 3^i$          注意高精度。

【代码】

import java.math.BigDecimal; 
import java.util.Scanner; 
import java.math.BigInteger;
  
public class Main {
    public static void main(String args[])
    {
        Scanner scan = new Scanner(System.in);
        BigInteger a;
        BigInteger b = new BigInteger("1");
        BigInteger c=new BigInteger("3");
        BigInteger ad=new BigInteger("1");
        a = scan.nextBigInteger();
        int cnt=1;
        while(a.compareTo(b)>0)
        {
            cnt++;
            b=b.multiply(c);
            b=b.add(ad);
        }
        System.out.println(cnt);
        return;
    }
}

【题J】

处女座的期末复习

【题解】

优先复习先考的科目,如果复习完超过考试时间就复习不完输出NO,否则加上考试的两小时。简单贪心。

【代码】

typedef long long int ll;
const int maxn=1e5+5;
struct p{
    ll a,b;
}f[maxn];
bool cmp(p x,p y)
{
    return x.b<y.b;
}
int main()
{
    int n,i; scanf("%d",&n);
    for(i=1;i<=n;i++) scanf("%lld",&f[i].a);
    for(i=1;i<=n;i++) scanf("%lld",&f[i].b);
    sort(f+1,f+n+1,cmp);
    int s=1; ll sum=0;
    for(int i=1;i<=n;i++)
    {
        sum+=f[i].a;
        if(sum<=f[i].b) sum+=2;
        else
        {
            s=0;break;
        }
    }
    if(s) puts("YES");
    else puts("NO");
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值