HRBU_20211108训练

声明:题目顺序是博主自己做以及补题时候的顺序,请勿掺杂个人感情

H - Class

题意:

给定x,y,已知x=a+b,y=a-b,需要我们求a*b的结果是多少

做法:

简单的式子计算
x=a+b,y=a-b→a=(x+y)/2
x=a+b,y=a-b→b=(x-y)/2

所以ab=((x+y)(x-y))/4→(x^ 2 -y^ 2)/4
恭喜签到第一题!OMO

#include<bits/stdc++.h>
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    int x,y;
    while(cin>>x>>y)
    {
        cout<<(x*x-y*y)/4.0<<endl;
    }
    return 0;
}

G - Worker

题意:

现在你作为一个生产商,你希望你的工厂的每一个车间的生产效率是一样的。毕竟资本家嘛,总得要为了Money着想呀!已知目前你拥有n个车间以及m个工人,然后每i个车间都有一个能力:可以把这个车间里的每一个工人的生产效率都变成a[i]。问你要如何进行每一个车间的工人数分配来达到每一个车间的生产效率总和是相等的。如果可以进行分配,请输出Yes并且输出每一个车间的工人数,否则则输出No。

做法:

资本主义的獠牙啊 ,由我大社会主义掰断!!当然题目还是要做的,留下了屈服的泪水,开个玩笑!!!
需要我们做到分配之后每一个车间生产效率的总和相等,然后我们需要将m个工人进行最优分配,首先我们需要知道这个最小的效率是多少呢?最小的效率。。。嘶~~,这个最小公倍数好像都要给我一拳,问这你都想不到是我??
所以先去求所有a[i]的最小公倍数呗,接下来就要去分配工人了,这个就是最小公倍数除以每一个车间的效率即每一个车间的最少工人数。然后判断一下当前的工人数是否为求出的最少工人数的倍数为啥是倍数呢?因为你求出的是每一个车间的最小工人数,也就是说进行分配时的人数只能是这个值的倍数或者本身
那么接下来恭喜你签到了第二题!OMO

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
ll a[maxn],b[maxn],num[110];
ll n,m;
int main()
{
    ios::sync_with_stdio(false);
    while(cin>>n>>m)
    {
        ll Pro=1;
        for(int i=1;i<=n;i++)
            cin>>a[i],Pro=Pro*a[i]/__gcd(a[i],Pro);
        ll sum=0;
        for(int i=1;i<=n;i++)
        {
            b[i]=Pro/a[i];
            sum+=b[i];
        }
        if(m%sum==0)
        {
            cout<<"Yes"<<endl;
            ll tmp=m/sum;
            for(int i=1;i<=n;i++)
            {
                cout<<tmp*b[i];
                if(i==n)
                    cout<<endl;
                else
                    cout<<" ";
            }
        }
        else
            cout<<"No"<<endl;
    }
    return 0;
}

F - Budget

题意:

你现在是个会计,需要你去计算公司今年的所有利润总和,因为公司是个小公司,所以每一笔利润都到了小数点后三位(属实为这个公司心疼)然后幕后大BOSS发话了,小数点后三位太难看了,给我四舍五入到两位!然后他又悄悄地给你一个人,两个结果算出来,然后相减(后者减去前者)的结果保留小数点后三位把(看来大BOSS是准备自己承受这一痛苦了)

做法:

原来以为可以直接小数变整数处理,然后看到数据的范围…1e18…不了不了,老老实实字符串吧!所以只需要字符串输入,然后特殊处理小数点后三位即可,因为整数部分几乎是不会变化的,就算有变化也是小数位变化导致的,因此只需要看小数点后的就行了。然后特判四舍五入以及995这个特殊点AC了!
恭喜你签到了第三题!OMO

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn=1e5+10;
//ll a[maxn],b[maxn],num[110];
ll n,m;
double a;

int main()
{
    ios::sync_with_stdio(false);
    while(scanf("%d",&n)!=EOF)
    {
        char s[25];
        int sum=0;
        for(int i=1;i<=n;i++)
        {
            int flag=0,tmp=0;
            scanf("%s",s);
            for(int i=0;i<strlen(s);i++)
            {
                if(s[i]=='.')
                {
                    flag=1;
                    continue;
                }
                if(flag)
                    tmp=tmp*10+s[i]-'0';
            }
            if(tmp>=995)
                sum+=1000-tmp;
            else
            {
                int x=tmp%10;
                if(x>=5)
                    sum+=10-x;
                else
                    sum-=x;
            }
        }
        printf("%.3f\n",(double)sum/1000.0);
    }
    return 0;
}

C - String

题意:

给你一个字符串,里面包含了四种字符:a,v,i,n,问当任意抽出四个字符时组成的字符串恰好是avin的几率是多少

做法:

概率求解,排列问题 (仅个人看法)求出每一个字符的出现次数,然后除以字符总长度,然后累乘,就是avin这个字符的出现概率了?,需要注意的是约分这个问题,比如8/256→1/32。
那么恭喜你这是第四题!!WOW

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
ll a[maxn],b[maxn],num[110];
ll n,m;
int main()
{
    ios::sync_with_stdio(false);
    while(cin>>n)
    {
        string s;
        cin>>s;
        int a,v,i,n;
        a=v=i=n=0;
        for(int j=0;j<s.size();j++)
        {
            if(s[j]=='a')
                a++;
            if(s[j]=='v')
                v++;
            if(s[j]=='i')
                i++;
            if(s[j]=='n')
                n++;
        }
        if(!a||!v||!i||!n)
        {
            cout<<"0/1"<<endl;
        }
        else
        {
            int tmp1=a*v*i*n;
            n=s.size();
            int tmp2=n*n*n*n;
            cout<<tmp1/__gcd(tmp1,tmp2)<<"/"<<tmp2/__gcd(tmp1,tmp2)<<endl;
        }
    }
    return 0;
}

D - Traffic

题意:

你的身份再次改变,现在你是一名交警,身处于一个十字路口。作为一个交警,必须服从交通规则来指挥车辆移动,现在这个路口有两条道路:一条东西走向,一条南北走向。根据交通规则,同一到达时间下,在南北道路上的车辆必须等东西道路上的车辆先移动后才能移动且时间+1,现在给定你所有车辆的到达时间,问你该如何指挥才能做到让所有车辆的等待时间最小呢?

做法:

暴力枚举,对于每一辆南北车道上的车辆去枚举在他到达后需要等待多少辆东西道路上的车过后才能通行,因为数据只有1000所以即便时间复杂度是O(N^2)也是OK的!注意:需要对数组进行sort,因为题目并没有说明给定的数组内部元素就是有序的,以及数组遍历该去遍历哪个数组的问题,当然是遍历长度更长的那个啦设想一下如果是东西道路上的车更多,那么南北道路上的是否就得等待这边走完才能移动呢反之,如果南北道路的车更多的话,当东西道路上的车走完的那一刻,南北道路上的车就不需要等待了呀直接走就完了,所以遍历长度更长的数组就好了。就喜欢这种题,我爱"暴力"(此暴力非生理暴力)
那么恭喜你,这是第五题!!( ^ ▽ ^ )

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int n,m;
int a[1010],b[1010];
int main()
{
    ios::sync_with_stdio(false);
    int x,y;
    while(cin>>n>>m)
    {
        int ans=0;
        for(int i=1; i<=n; i++)
            cin>>a[i];
        for(int i=1; i<=m; i++)
            cin>>b[i];
        sort(a+1,a+1+n);
        sort(b+1,b+1+m);
        while(1)
        {
            int flag=1;
            for(int i=1; i<=max(n,m); i++)
            {
                for(int j=1; j<=max(n,m); j++)
                {
                    if(a[i]==b[j])
                    {
                        flag=0;
                        break;
                    }
                }
                if(!flag)
                    break;
            }
            if(flag)
            {
                cout<<ans<<endl;
                break;
            }
            ans++;
            for(int i=1; i<=m; i++)
                b[i]+=1;
        }
    }
    return 0;
}

B - Wave

题意:

在一个给定的数组中寻找"波浪",啥叫波浪呢?是一个子序列1、满足元素个数大于等于2个。2、所有奇数位上的数字是同一个。3、所有偶数位上的数字是同一个。4、奇数位与偶数位上的数字不同。问给定的数组中最大的"波浪"的长度是多少?

做法:

一个年轻的博主曾经暴力的跑过,再被T给打脸后还不死心,修改了输入方式再次提交还是T了。无奈之后,这个蒟蒻采取了"求救",发现了dalao(链接)极其极其简短的代码以及那非常明确的思路。首先讲解一下自己的思路:首先在输入的时候将每一个数据的出现过的位置都存入一个二维数组中(只有100数据范围是可以接受的)接着去两遍暴力去跑100的数据第一遍则是遍历奇数位置上的数字第二遍则是偶数上的位置记录长度,注意:每一次遍历后的位置都是要记下来的,因为题目没有说明数据量必须取完,可以选择部分数据量来构成答案。最后判断长度输出。QAQ,T了啊。
再看看dalao的,直接一个类DP,dp[i][j]表示j这个数字,前一个数字为i时的子序列长度,所以直接在输入的时候就可以判断结束。
恭喜LLM蒟蒻签到失败!QAQ

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
/*int main()
{
    ios::sync_with_stdio(false);
    int n,c;
    while(scanf("%d%d",&n,&c)!=EOF)
    {
        int a,ans=0;
        vector<int> v[110];
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a);
            v[a].push_back(i);
        }
        for(int i=1;i<=c;i++)
        {
            for(int j=1;j<=c;j++)
            {
                int len=0,front_pos=0,od=0,ev=0;
                int odd=v[i].size(),even=v[j].size();
                if(i==j)
                    continue;
                while(1)
                {
                    while(od<odd&&v[i][od]<front_pos)
                        od++;
                    if(od==odd)
                        break;
                    front_pos=v[i][od];
                    len++;
                    while(ev<even&&v[j][ev]<front_pos)
                        ev++;
                    if(ev==even)
                        break;
                    front_pos=v[j][od];
                    len++;
                }
                ans=max(ans,len);
            }
            printf("%d\n",ans);
        }
    }
    return 0;
}*/
//某蒟蒻博主写的LJ代码

int main()
{
    ios::sync_with_stdio(false);
    int n,c,x;
    int dp[110][110];
    while(cin>>n>>c)
    {
        memset(dp,0,sizeof(dp));
        int ans=0;
        for(int i=1;i<=n;i++)
        {
            cin>>x;
            for(int j=1;j<=c;j++)
            {
                dp[j][x]=dp[x][j]+1;
                if(j!=x)
                    ans=max(ans,dp[j][x]);
            }
        }
        cout<<ans<<endl;
    }
}

E - Rng

题意:

给定一个n,然后让你随机生成两个区间,随机生成一个r∈[1,n],在随机生成一个l∈[1,r],求两个区间相交的概率q/p。最后结果对1e9 + 7进行取模。

思路:

参考的dalao(链接)的思路,说实话比赛期间我看到这题目,我一般直接溜,对于数学是真的不感冒QAQ据说是个数学结论题,但是我看不出来呀。。。但是求解期间需要快速幂这个我还能上手的,还得再理解理解。

每日小结

说实话,在看到题目的过题人数时,本人是震惊的,这啥实力呀,这么巨巨的吗?然后发现自己好像也能过个四五题o()q但是发现自己的短板太明显了,数学的以及字符串处理卡了一年!大大的问题呀。噫吁嚱,犹自力不足也,不得加油也!好好的做好自己的工作,不留遗憾,不说我一直在,但是曾经我来过,不也足够了吗?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值