AcWing打卡day5

1.最高的牛
题意:已知最高的牛是第几头,多高,如果两头牛之间的牛都比这两头牛矮,则这两头牛可以相互看见,给你一些两头牛想换看见的关系,求每头牛最大可能身高
思路:差分,如果a,b牛能相互看见,则[a+1,b-1]区间所有牛身高至少减1,要去重
代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
const ll maxn=10010;
ll cf[maxn];
ll dd[maxn];
bool cc[maxn][maxn];
int main()
{
    ll n,p,h,m;
    cin>>n>>p>>h>>m;
    for(int i=1;i<=m;i++)
    {
        ll a,b;
        cin>>a>>b;
        if(a>b)
        {
            swap(a,b);
        }
        if(cc[a][b]==0)
        {
            cc[a][b]=1;
            cf[a+1]--;
            cf[b]++;
        }
    }
    for(int i=1;i<=n;i++)
    {
        dd[i]=dd[i-1]+cf[i];
        cout<<h+dd[i]<<endl;
    }
}

2.最佳牛围栏
题意:求序列中一段长度不小于F连续序列的平均值最大值是多少
思路:二分平均值,枚举序列中是否满足,利用前缀和,如果一段区间的平均值大于mid,则区间内每个数减去mid的和大于0
代码

#include<iostream>
#include<algorithm>
using namespace std;
int a[100010];
double sum[100010];
int n,f;
int chack(double mid)
{
    sum[0]=0;
    for(int i=1;i<=n;i++)
    {
        sum[i]=sum[i-1]+a[i]-mid;
    }
    double mi=0;
    for(int i=0,j=f;j<=n;i++,j++)
    {
        mi=min(mi,sum[i]);
        if(sum[j]-mi>=0)return 1;
    }
    return 0;
}
int main()
{
    cin>>n>>f;
    int maxr=0;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        maxr=max(a[i],maxr);
    }
    double r=(double)maxr,l=0;
    double mid;
    while(r-l>1e-5)
    {
        mid=(l+r)/2;
        if(chack(mid))
        {
            l=mid;
        }
        else
        {
            r=mid;
        }
    }
    cout<<(int)(r*1000)<<endl;
}

3.电影
题意:如果选一部电影一般开心最多,如果一般开心人数相等,选择非常开心更多的电影
思路:结构体排序+map
代码

#include<bits/stdc++.h>
using namespace std;
typedef struct flim
{
    int happy_number;
    int very_happy_number;
    int id;
}flim;
flim a[200005];
int b[200005],c[200005];
map<int,int>mp;
bool cmp(flim x,flim y)
{
    if(x.happy_number==y.happy_number)return x.very_happy_number>y.very_happy_number;
    else return x.happy_number>y.happy_number;
}
int main()
{
    int n,m;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        int x;
        cin>>x;
        mp[x]++;
    }
    cin>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>b[i];
    }
    for(int i=1;i<=m;i++)
    {
        cin>>c[i];
    }
    int cnt=0;
    for(int i=1;i<=m;i++)
    {
        a[cnt].id=i;
        a[cnt].happy_number=mp[b[i]];
        a[cnt].very_happy_number=mp[c[i]];
        cnt++;
    }
    sort(a,a+cnt,cmp);
    cout<<a[0].id<<endl;
}

4.货仓选址
题意:找到一个位置使到所有商店的距离和最短
思路:找到序列的中位数
代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[100005];
ll ans=0;
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    ll mid=(n+1)/2;
    for(int i=1;i<=n;i++)
    {
        ans+=abs(a[mid]-a[i]);
    }
    cout<<ans<<endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值