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