HRBU_20211024周赛

目录

K-Many Littles Make a Mickle

题意:

做法:

B-Continued Fraction

题意:

做法:

L-It Rains Again

题意:

做法:

H-Hearthstone So Easy

题意:

做法:


 题目链接的话就是题目哦,点击就行,是超链接!其次,这个题目的顺序是我做题以及补题的顺序,推荐就按这个顺序来,如果是dalao,当我没说!告辞!

K-Many Littles Make a Mickle

题意:

题目意思很言简意赅,聚沙成塔,每i层都会有i*i个房间,每一个房间都能容纳M个人,问N层的沙塔能够容纳多少人

做法:

真的签到!出题人真好!暴力模拟即可,数据范围也不大

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    int T,N,M;
    cin>>T;
    while(T--)
    {
        int sum=0;
        cin>>N>>M;
        for(int i=1;i<=N;i++)
        {
            sum+=i*i*M;
        }
        cout<<sum<<endl;
    }
    return 0;
}
/**
2
2 2 2 2
3
3 3 3 3
3 3 3 3 3 3 3 3 3
*/

B-Continued Fraction

题意:

给定一个计算公式(做法里见),然后要求把这个式子得到的结果转换成公式的样子,并且把补上的数字由高到低,由左到右依次输出

做法:

咱先来推导一下第一个样例105/38

2*4+1=9 9*3+2=29 29*1+9=38 38*2+29=105

这样一个过程我们能很明显的看出,最后结果的分母分子和a数组里的数字的一些神奇的关系,这样咱就可以由结果慢慢的推导出每一个数组以及最开始的分母,中间的求解过程得稍微注意注意,特别是除数以及这个余数的交换得注意,第一发就是错在这里了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=110;
int main()
{
    int T,X,Y;
    vector<int> ans;
    cin>>T;
    while(T--)
    {
        ans.clear();
        cin>>X>>Y;
        int tmp=X,flag=0;
        if(X==1)
            ans.push_back(0),ans.push_back(Y),flag=1;
        while(tmp!=1)
        {
            tmp=X%Y;
            ans.push_back((X-tmp)/Y);
            //cout<<((X-tmp)/Y)<<" "<<tmp<<" "<<Y<<" "<<X<<endl;
            X=Y,Y=tmp;
        }
        if(!flag)
            ans.push_back(X);
        cout<<ans.size()-1;
        for(int i=0;i<ans.size();i++)
            cout<<" "<<ans[i];
        cout<<endl;
    }
    return 0;
}
/**
x+1/y=(x*y+1)/y
2*4+1=9*3+2=29*1+9=38*2+29=105
(((A(n)*A(n-1)+1)*A(n-2)+A(n))*A(n-3))+(A(n)*A(n-1)+1))
A(n)*A(n-1)=F(n)
*/

L-It Rains Again

题意:

老天爷要下雨!你处于一个X-Y坐标轴上,雨水从Y轴从上往下来,这个坐标轴里存在一些挡雨板,他们的开头位置以及结尾位置都会给定,然后问你能躲雨的地方一共有多长?(区间和)且题目声明没有竖直方向的挡雨板。

做法:

做这题直观感觉,“这题好简单!但是我为什么WA了,我是fw?”比赛结束,看题解,挡雨板?!求错东西了!我确实是fw,QAQ!借用题目给的样例图

 题目要求的其实就是黄色部分的总长度和,一个简简单单的前缀和就搞定了,我整了一下午。。。我个人感觉就是用前缀和做的话,一个点得注意就是区间长度这个,标记的时候x2不能标记到,否则会重复计算导致WA,因为我自己在码的时候连样例都没过去,所以个人感觉得注意点,有dalao说我是错的,那就是错的,dalao yyds

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;

int main()
{
    int n,a[maxn];
    while(cin>>n)
    {
        memset(a,0,sizeof(a));
        for(int i=1; i<=n; i++)
        {
            int x1,x2,y1,y2;
            cin>>x1>>y1>>x2>>y2;
            for(int i=x1; i<x2; i++)
                a[i]=1;
        }
        /*for(int i=1;i<=10;i++)
            cout<<a[i]<<" ";
        cout<<endl;*/
        for(int i=1;i<=maxn;i++)
        {
            if(a[i]==1)
                a[i]=a[i-1]+a[i];
            else
                a[i]=a[i-1];
        }
        /*for(int i=1;i<=10;i++)
            cout<<a[i]<<" ";
        cout<<endl;*/
        cout<<a[maxn]<<endl;
    }
    return 0;
}
/**
求总区间长度和
*/

H-Hearthstone So Easy

题意:

两个人在玩炉石(虽然没玩过,但是看人玩过),然后两个人都没卡了,这意味着从现在开始他们两个人每抽一次卡都得扣除一定的疲劳值(也就是生命值),注意:疲劳值是递增的,初始值是0,然后依次+1。然后两个人的游戏过程分为两个过程:一个是抽卡过程,需要扣除疲劳值(也就是生命值);另一个则是对于对方的操作或者对自己的操作,可以扣除对方K的血量,也可以给自己增加K的血量(无上限)。问两个人最后谁能活着,成王败寇!谁活着谁胜利!

做法:

看了题解才明白这个博弈的三种结果,脑淤血系列,首先,每一回合的开始两个人的血量都是一样的,这是为啥呢?题目给定的(惊不惊喜,意不意外)就是每一回合两个人对应的操作都是一样的,就导致了两个人连扣出生命值都是同步的,因此每一回合开始,两人血量都是一样的,咱假设第i个回合P能打败F了,这说明第i-1个回合的时候P打败不了F;但是F对于P的操作比P对F的操作永远要快一回合,因为P无法打败F的话,P必然会被下一回合的疲劳值把生命值直接扣除到0及以下,所以只要P第一回合无法打败F,那么F就必定是胜利的。然后再来解答另外两种情况:1、P第一回合能直接打败F,或者P能把F的健康值直接扣除到1,那么F下一回合抽卡时就会因为疲劳值直接战败。2、P直接抽卡就被疲劳值扣除完了生命值,也就是n==1的情况,P连卡都抽不了,哪有怎么去打败F呢?

就是以上三种情况,这都是题解的功劳,QAQ,这次的比赛还是好拉啊,最近太久没码题目了,反应慢了真的好多,得好好静下心修炼了!

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=5e4+10;
int main()
{
    int n,k,t;
    cin>>t;
    while(t--)
    {
        cin>>n>>k;
        if(n==1)
        {
            cout<<"freesin"<<endl;
        }
        else if(n-k<=1)
        {
            cout<<"pllj"<<endl;
        }
        else
        {
            cout<<"freesin"<<endl;
        }
    }
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值