ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2019欢乐友谊赛A题题解

2019-11-16 20:57:23  阅读:282  来源: 互联网

标签:cha int 题解 ll cin MAXT 2019 友谊赛 MAXCHA


题目原文:

 

 

 

 

 

 

 

题目大意:

一条龙开始有X个头,你把它头砍完就胜利了。

你有n种方式去砍头。每一种方式有两个量d与h,表示你先砍掉龙d个头,龙再长出来h个头。

n种方法使用没有顺序,且每种方法可以使用无数次(笑,既然最厉害的大招无CD,那就拼命放大就好了)

思路:

记下来这n种方法中,砍头d最大的那种方法的砍头数为MAXT,(此处不关心这个方法砍完长出来的头数)

情况一:如果龙初始的头比MAXT小,拜拜了,直接用这招砍下去,拜拜了,OTK(一个回合秒杀), 砍完就直接结束游戏,头不会再长。

 

否则的话,我们不能直接用这一招,因为 不能OTK,龙被砍了d个头,还会长h个头,又恢复了(甚至万一h >d就尴尬了,越打越多),所以

此等大招,留到最后再放,先掐在手里。先找到所有方法中d-h最大的一组,记max(d - h) 为MAXCHA

 

情况二:排除掉情况一OTK的情况下,若MAXCHA  <= 0,再打十年你大学也毕不了业,输出-1吧

 

剩下就是常规情况了,我们只需要用贪心,前期一直用收益(d与h的差 MAXCHA)最大的方法打龙,

打到龙还有最后一丝血(血量小于MAXT)时,直接往他身上放寒冰惩戒(MAXT那一招,头不会再长出来),这样,

不用担心对方来偷龙了,再去把对面中路兵线清了,赶紧至少拿下一座中塔吧,不然拿龙有啥用呢对吧,中路团,小心对方切后排。

 

情况三:排除前两种情况,即MAXCHA > 0 时, 前面有MAXCHA对应的招数,当龙的血量在MAXT以下时,直接使用MAXT,

当然,处理的时候可以优化一下: 直接把龙的初始头数X -= MAXT , 总次数先初始化为1 , 再直接用剩下的 X除以MAXCHA得到

的答案再加1就是前面攻击次数(当然如果刚好整除就不用+1了)

 

PS:最后给出了AK代码, 其中关于d h 涉及到结构体排序。当时脑子不太清楚,其实不太需要。

在读入d h 的时候就可以直接记忆化MAXT和MAXCHA, 并且d与h根本就不需要开数组(结构体数组),

因为只需要MAXT, MAXCHA,所以每次读取时用临时的d h就好了

此处用伪代码改进:伪代码伪代码!!!!!

 

MAXT = -100000

MAXCHA = -100000

for  : 

cin >> d >> h

if   d   > MAXT: 

  MAXT = d

if   d - h > MAXCHA

  MAXCHA = d - h

end for;

 

 

代码:

#include <iostream>
#include <algorithm>
using namespace std;

typedef long long ll;

struct node
{
    ll d;
    ll h;
    ll cha;
}a[101];


bool cmp(node a, node b)

{
    if(a.cha != b.cha)
    return a.cha>b.cha;
    else if(a.d!=b.d)
    return a.d > b.d;
    else
        return a.h < b.h;

}

int main()
{
    int t;
    cin >> t;
    while(t --)
    {
        int n;//100
        int x;//109
        cin >> n >> x;
        int maxT = -100;
        int maxCha = -100;
        for(int i = 0; i < n; ++ i)
        {
            cin >> a[i].d >> a[i].h;
            a[i].cha = a[i].d - a[i].h;
            if(a[i].d > maxT)
                maxT = a[i].d;
            if(a[i].cha > maxCha)
                maxCha = a[i].cha;
        }
        sort(a, a + n, cmp);
        int num = 0;
        
        if(x <= maxT)
            num = 1;
        else if(maxCha <= 0)
            num = -1;
        else
        {
            x -= maxT;
            num = 1;
            if(x % a[0].cha == 0)
                num += x / a[0].cha;
            else
                num += x / a[0].cha + 1;
        }
            cout << num << endl;
    }
    return 0;
}

 

 

 

 

 

标签:cha,int,题解,ll,cin,MAXT,2019,友谊赛,MAXCHA
来源: https://www.cnblogs.com/Chaosliang/p/11873473.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有