牛客小白月赛43 C 木棍游戏 (海伦公式应用)D 有趣的区间

海伦公式:它是利用三角形的三条边的边长直接求三角形面积的公式。

表达式为:S=√p(p-a)(p-b)(p-c),p=(a+b+c)/2。

C    木棍游戏
题意:给出 n根长度不一的木棍,第 i根棍子长度为a[i], 两根长度分别为a[i],a[j]的木棍可以拼接成一根长度为a[i]+a[j]的木棍,同理 33 根, 44 根,甚至 nn 根都能拼接。问:使用这 nn 根木棍作三角形的边(一根木棍至多使用一次,也可以不使用),能拼出的面积最大的三角形的面积。

思路:首先这道题要知道一个海伦公式--已知三角形三条边,求三角形的面积。
p=(a+b+c)/2;s=sqrt(p*(p-a)*(p-b)*(p-c));对于这道题,因为数据范围很小,所以直接暴力枚举即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=10;
double a[N],ans=-1;
int n;
bool flag;
void dfs(double l1,double l2,double l3,int cnt)
{
    if(cnt>n) return;
    if(l1+l2>l3&&l1+l3>l2&&l2+l3>l1)
    {
        flag=true;
        double p=(l1+l2+l3)/2;
        ans=max(ans,sqrt(p*(p-l1)*(p-l2)*(p-l3)));
    }
    dfs(l1+a[cnt],l2,l3,cnt+1);
    dfs(l1,l2+a[cnt],l3,cnt+1);
    dfs(l1,l2,l3+a[cnt],cnt+1);
    dfs(l1,l2,l3,cnt+1);//不用当前这根棍子
}
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>a[i];
    dfs(0,0,0,0);
    if(flag)
        printf("%.1lf\n",ans);
    else
        printf("-1\n");
    return 0;
}

D    有趣的区间
题意:给出一个长度为 n的数组 A,下标从 1 开始,A1,12,A3...。定义一个区间 [l,r][l,r] 是“有趣的区间”,当且仅当Al|A2|A3|...|Ar结果为奇数。求有趣区间的个数。

思路:要使结果为奇数,只需要所在的区间至少有一个奇数。分奇偶讨论,①a[i]为奇数时,ans+=n-i+1;
②a[i]为偶数时,从i往前找到第一个奇数a[j],ans+=n-j+1(只要找到一个奇数那么从该数开始往后的数都可以分别构成一个区间)。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e5+10;
ll odd[N],ne[N];
int main()
{
    int n;
    scanf("%d",&n);
    int x;
    ll res=0;
    for(int i=1;i<=n;i++)
    {
       scanf("%d",&x);
        if(x%2) odd[i]=i;
    }
    for(int j=0,i=n;i>0;i--)
    {
        if(odd[i]) j=i;
        else 
        {
            if(j) ne[i]=j;
        }
    }
   for(int i=1;i<=n;i++)
   {
       if(odd[i]) res+=n-i+1;
       else if(ne[i]) res+=n-ne[i]+1;
   }
    printf("%lld\n",res);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值