HRBU 2021年暑期训练阶段四Day2

目录

A - Drying

题目链接:

题意:

做法:

B - Garland

题目链接:

题意:

做法:

C - How Many Tables

题目链接:

题意:

做法:

D - Can you solve this equation?

题目链接:

题意:

做法:

E - CD

题目链接:

题意:

做法:

F - Monthly Expense

题目链接:

题意:

做法:

G - Aggressive cows

题目链接:

题意:

做法:


A - Drying

题目链接:

HRBU 2021年暑期训练阶段四Day2 - Virtual Judge

题意:

有一堆湿衣服和一台烘干机,每一件湿衣服上都有一个固定的湿度,每过一秒湿度就会减少1,当湿衣服放在烘干机上时,湿度每秒减少k,问最少需要几秒,能把所有湿衣服都烘干

做法:

二分答案,判断时注意向上取整,因为当湿度小于k时还是要消耗一秒来烘干的

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<string.h>
#include<cstdlib>
#include<fstream>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<iomanip>
#include<iomanip>
#include<cmath>
#define Pi acos(-1.0)
using namespace std;
typedef long long ll;
const ll maxn=1e5+10;
ll n,a[maxn],k;

int main()
{
    ios::sync_with_stdio(false);
    while(scanf("%d",&n) != EOF)
    {
        ll maxx=0;
        memset(a,0,sizeof(a));
        for(int i=1;i<=n;i++)
            scanf("%lld",&a[i]),maxx=max(maxx,a[i]);
        scanf("%lld",&k);
        if(k==1)
        {
            printf("%lld\n",maxx);
            continue;
        }
        ll l=1,r=maxx,mid,ans,sum=0;
        while(l<=r)
        {
            sum=0;
            mid=(l+r)/2;
            for(int i=1;i<=n;i++)
            {
                if(a[i]>mid)
                    sum+=(ceil((a[i] - mid ) * 1.0 / (k - 1) ));
            }
            if(sum<=mid)
                ans=mid,r=mid-1;
            else
                l=mid+1;
        }
        printf("%lld\n",ans);
    }
    return 0;
}
/**

*/

B - Garland

题目链接:

HRBU 2021年暑期训练阶段四Day2 - Virtual Judge

题意:

一个类似于反抛物线的曲线,告诉你曲线的左边端点,并且这个曲线上的每一个点的高度都是相邻两个点的高度平均值-1,问当右端点最矮是多少时,最低点不会触碰到地面(也就是x轴)

做法:

一如既往的二分答案,区间精度的话似乎是小于1e-7即可

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<string.h>
#include<cstdlib>
#include<fstream>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<iomanip>
#include<iomanip>
#include<cmath>
#define Pi acos(-1.0)
using namespace std;
typedef long long ll;
const ll maxn=1e5+1000;
int N;
double A,num[1010],ans;

bool judge(double x)
{
    double tmp=A,sum=x;
    for(int i=3;i<=N;i++)
    {
        double temp=sum;
        sum=2*sum-tmp+2;
        tmp=temp;
        if(sum<1e-10)
            return false;
    }
    ans=sum;
    return true;
}

int main()
{
    ios::sync_with_stdio(false);
    while(scanf("%d%lf",&N,&A)==2)
    {
        double l=0,r=maxn,mid;
        ans=0;
        while(r-l>1e-10)
        {
            mid=(l+r)/2.0;
            if(judge(mid))
                r=mid;
            else
                l=mid;
        }
        printf("%.2f\n",ans);
    }
    return 0;
}
/**

*/

C - How Many Tables

题目链接:

HRBU 2021年暑期训练阶段四Day2 - Virtual Judge

题意:

你和一群你的好朋友办聚餐,你的每一个好朋友呢又有不同的圈子,不同的朋友圈不能交叉在一起,问最少需要几张桌子才能保证所有的朋友圈都是独立的

做法:

标标准准的并查集的板子题

自己手写的一个板子(仅供参考)

#include<bits/stdc++.h>
#include<stack>
using namespace std;
typedef long long ll;
const int maxn=1e3+10;
int N,M;
int f[maxn];
void init(int n)
{
    for(int i=1; i<=n; i++)
        f[i]=i;
}
int Find(int x)
{
    while(f[x]!=x)
        x=f[x];
    return x;
}
void merge(int a,int b)
{
    int x=Find(a);
    int y=Find(b);
    if(x!=y)
        f[x]=y;
}
int main()
{
    int fa,so;
    while(cin>>N>>M&&N)
    {
        init(N);
        for(int i=1; i<=M; i++)
        {
            cin>>fa>>so;
            merge(fa,so);
        }
        int cnt=-1;
        for(int i=1; i<=N; i++)
            if(f[i]==i)
                cnt++;
        cout<<cnt<<endl;
    }
    return 0;
}
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<string.h>
#include<cstdlib>
#include<fstream>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<iomanip>
#include<iomanip>
#define Pi acos(-1.0)
using namespace std;
typedef long long ll;
const int maxn=1010;
int T,n,m;
int fa[maxn];

void init()
{
    for(int i=1;i<=n;i++)
        fa[i]=i;
}

int Find(int x)
{
    if(fa[x]==x)
        return x;
    return fa[x]=Find(fa[x]);
}

void Merge(int a,int b)
{
    int x=Find(a);
    int y=Find(b);
    if(x!=y)
        fa[y]=x;
}

int main()
{
    ios::sync_with_stdio(false);
    cin>>T;
    while(T--)
    {
        int ans=0;
        cin>>n>>m;
        init();
        while(m--)
        {
            int a,b;
            cin>>a>>b;
            Merge(a,b);
        }
        for(int i=1;i<=n;i++)
            if(fa[i]==i)
                ans++;
        cout<<ans<<endl;
    }
    return 0;
}
/**

*/

D - Can you solve this equation?

题目链接:

https://vjudge.net/contest/453932#problem/D

题意:

给定一个方程式8*x^4 + 7*x^3 + 2*x^2 + 3*x + 6 == Y,给定Y的值,求X的值

做法:

咱们对于X进行一个答案二分,然后再带回式子中看是否成立,若是小于Y则提高下限,否则降低上限

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<string.h>
#include<cstdlib>
#include<fstream>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<iomanip>
#include<iomanip>
#define Pi acos(-1.0)
using namespace std;
typedef long long ll;
const ll maxn=1e10;
int T,Y;

double judge(double x)
{
    return 8*x*x*x*x+7*x*x*x+2*x*x+3*x+6;
}

double slove()
{
    if(judge(0)>Y||judge(100)<Y)
        return 0;
    double l=0.0,r=100.0,mid;
    while(r-l>1e-10)
    {
        mid=(l+r)/2.0;
        if(judge(mid)>(double)Y)
            r=mid;
        else
            l=mid;
    }
    return mid;
}

int main()
{
    ios::sync_with_stdio(false);
    cin>>T;
    while(T--)
    {
        cin>>Y;
        if(!slove())
            cout<<"No solution!"<<endl;
        else
            cout<<fixed<<setprecision(4)<<slove()<<endl;
    }
    return 0;
}
/**

*/

E - CD

题目链接:

HRBU 2021年暑期训练阶段四Day2 - Virtual Judge

题意:

给定两个数组(已经是升序了),问两个数组中相同的元素有几个

做法:

首先可以暴力!数组开到一千万就能暴力跑过,其次二分查找是正解,绝对不会超时

多组输入哦,别被这个给搞了

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<string.h>
#include<cstdlib>
#include<fstream>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<iomanip>
#define Pi acos(-1.0)
using namespace std;
typedef long long ll;
const ll maxn=1e6+10;
int n,m;
int a[maxn],b;

int erfen(int b)
{
    int l=1,r=n,mid;
    while(l<=r)
    {
        mid=(l+r)/2;
        if(a[mid]==b)
            return 1;
        else
        {
            if(a[mid]>b)
                r=mid-1;
            else
                l=mid+1;
        }
    }
    return 0;
}

int main()
{
    ios::sync_with_stdio(false);
    while(cin>>n>>m&&n&&m)
    {
        int num=0;
        memset(a,0,sizeof(a));
        for(int i=1;i<=n;i++)
            cin>>a[i];
        for(int i=1;i<=m;i++)
        {
            cin>>b;
            num+=erfen(b);
        }
        cout<<num<<endl;
    }
    return 0;
}
/**

*/

F - Monthly Expense

题目链接:

HRBU 2021年暑期训练阶段四Day2 - Virtual Judge

题意:

给定了n组数据,求这些数组中数据和中的最小值最大时是多少

做法:

最小值最大化啦,贪心的想,贪心的二分的干活

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<string.h>
#include<cstdlib>
#include<fstream>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<iomanip>
#include<iomanip>
#define Pi acos(-1.0)
#define inf 1e9+7;
using namespace std;
typedef long long ll;
const ll maxn=1e5+10;
int N,M;
int mon[maxn];

bool judge(int x)
{
    int cnt=0,sum=0;
    for(int i=1;i<=N;i++)
    {
        if(sum+mon[i]<=x)
            sum+=mon[i];
        else
            sum=mon[i],cnt++;
    }
    if(cnt<M)
        return false;
    return true;
}

int main()
{
    ios::sync_with_stdio(false);
    while(cin>>N>>M)
    {
        memset(mon,0,sizeof(mon));
        for(int i=1;i<=N;i++)
            cin>>mon[i];
        int l=mon[1];
        int r=0,mid;
        for(int i=1;i<=N;i++)
        {
            r+=mon[i];
            l=max(l,mon[i]);
        }
        while(l<=r)
        {
            mid=(l+r)/2;
            if(judge(mid))
                l=mid+1;
            else
                r=mid-1;
        }
        cout<<l<<endl;
    }
    return 0;
}
/**

*/

G - Aggressive cows

题目链接:

HRBU 2021年暑期训练阶段四Day2 - Virtual Judge

题意:

在一条数轴上有几个固定位置的牛棚,要把C头牛牛放到这些牛棚里,两头牛牛要是离得太近会干架,所以需要你尽可能的把这些牛牛分开来,问这些牛牛确定位置后最小距离的最大值是多少呢

做法:

好熟悉呀,最小值最大化,和上一题类似呀,但是输入的位置数据需要排序,因为不是升序的

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<string.h>
#include<cstdlib>
#include<fstream>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<iomanip>
#include<iomanip>
#define Pi acos(-1.0)
#define inf 1e9+7;
using namespace std;
typedef long long ll;
const ll maxn=1e5+10;
int N,C;
int X[maxn];

bool judge(int x)
{
    int cnt=1,sum=0;
    for(int i=2;i<=N;i++)
    {
        if(sum+X[i]-X[i-1]<x)
            sum+=X[i]-X[i-1];
        else
            sum=0,cnt++;
    }
    if(cnt<C)
        return false;
    return true;
}

int main()
{
    ios::sync_with_stdio(false);
    while(cin>>N>>C)
    {
        for(int i=1;i<=N;i++)
            cin>>X[i];
        sort(X+1,X+N+1);
        int l=X[N]-X[1];
        int r=l,mid;
        for(int i=2;i<=N;i++)
            l=min(l,X[i]-X[i-1]);
        while(l<=r)
        {
            mid=(l+r)/2;
            if(judge(mid))
                l=mid+1;
            else
                r=mid-1;
        }
        cout<<r<<endl;
    }
    return 0;
}
/**

*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值