• Test on 11/10/2018


    杭电半日游,这新生赛出的题目比较简单,刚开始四十分钟写了三道题,并拿了一个一血,得到气球超开心。

    可是后来就写不出来了,还是学的太少。

    感觉还是有增长信心的,虽然感觉自己以前学过欺负他们,但是我也忘完了呀。

    还是要努力啊QAQ

    不要丧失希望,永远保持斗志,加油吧。

    A:热烈的决斗者

    Description

    Jeff正在玩一种卡牌游戏,在这个游戏中,每个回合玩家可以执行以下两种操作无数次:

    1.使用一张手上的牌。
    2.命令场上的一只生物对敌方造成伤害,每一只生物在一个回合内最多攻击一次。

    现在Jeff的场上拥有n只生物,第i只怪物拥有ai点攻击力与bi点血量。
    同时,Jeff手上有m张手牌。由于他的运气实在太差了,他的所有手牌都只有一个功能——使场上一只生物的攻击力等于它的血量。

    现在正是斩杀对手的关键回合,Jeff希望他能通过一种合理的策略,对敌方造成最高的伤害。请帮助Jeff计算他能造成的最高伤害。

    Input

    题目包含多组测试数据。
    第一行是一个整数T,表示有T组测试数据。
    对于每组测试数据,第一行包含两个整数n,m(0 <= n,m <= 500),表示场上生物数量和手牌数量。
    接下来的n行,每行包含两个整数ai,bi(1 <= ai,bi <= 10000000),表示第i只怪物的攻击力和血量。

    Output

    输出Jeff在一个回合内能对敌方造成的最高伤害。

    Examples

    Input

    1
    3 2
    1 3
    2 4
    5 3

    Output

    12
    Hint
    对于第一组样例: Jeff可以先对场上第1只和第2只生物使用手牌,使得它们的攻击力变成3和4。 然后Jeff命令所有生物攻击,总共可以造成12点伤害。

    正确解法:

    原本就是全部加a[i],把b[i]-a[i] 排序,取出前m个在加起来,不知道为什么wa

    等待正解。

    B:qw的表白

    Description

    qw喜欢上了一个美丽的女孩,并勇敢向她表白。但女神喜欢算法厉害的男生,便给他出了一道题:
    给定包含n 个整数的数列am 个询问,每个询问包含两个整数LR ,对于每一个询问,要求输出数列中有多少个数ai ,满足La2iR ,即有多少个数平方后取值范围在[L,R] 之间。
    单身二十年的qw非常想谈恋爱,你能帮帮他吗? 

    Input

    多组数据。
    第一行给出数据组数T(1T50
    每组数据首先给定两个整数n ,m ,表示数列中数的个数和询问个数。(1n,m50000
    随后一行给出n 个整数 a1,a2,a3...an1ai1e9
    随后m 行,每行两个整数 L , R ,表示当前询问的数值范围区间。(1LR1e9

    Output

    对于每个询问,单独输出一行,包含一个整数,表示数列中满足条件的数个数

    Examples

    Input

    1
    5 3
    1 2 3 4 5
    1 4
    4 9
    1 25

    Output

    2
    2
    5

    正确解法:

    我以为1e9 long long 会超,其实不会,那么就很简单

    long long 排序,二分搜索。

    写了半天二分搜索,后面发现可能有一个二分函数,有点sad,但无论学了什么都要保证自己会呀。

     1 #include "pch.h"
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<cmath>
     5 #include<string>
     6 #include<cstring>
     7 #include<algorithm>
     8 using namespace std;
     9 int n, m;
    10 long long a[50100],l,r;
    11 long long upp(int n,long long r)
    12 {
    13     int ll = 0, rr = n+1;
    14     while (ll+1 < rr)
    15     {
    16         int mid = (ll + rr) / 2;
    17         if (a[mid] <= r)    ll = mid;
    18         else rr = mid;
    19     }
    20     return rr;
    21 }
    22 long long downn(int n, long long l)
    23 {
    24     int ll = 0, rr = n;
    25     while (ll + 1 < rr)
    26     {
    27         int mid = (ll + rr) / 2;
    28         if (a[mid] >= l)    rr = mid;
    29         else ll = mid;
    30     }
    31     return ll;
    32 }
    33 int main()
    34 {
    35     int t;
    36     cin >> t;
    37     while (t--)
    38     {
    39         cin >> n >> m;
    40         memset(a, 0, sizeof(a));
    41         for (int i = 1; i <= n; i++)
    42         {
    43             cin >> a[i];
    44             a[i] = a[i] * a[i];
    45         }
    46         sort(a + 1, a + n + 1);
    47         for (int i = 1; i <= m; i++)
    48         {
    49             cin >> l >> r;
    50             cout << upp(n, r) - downn(n, l) - 1 << endl;
    51         }
    52     }
    53     return 0;
    54 }
    View Code
     1 #include "pch.h"
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<cmath>
     5 #include<string>
     6 #include<cstring>
     7 #include<algorithm>
     8 using namespace std;
     9 int n, m;
    10 long long a[50100],l,r;
    11 long long upp(int n,long long r)
    12 {
    13     int ll = 0, rr = n+1;
    14     while (ll+1 < rr)
    15     {
    16         int mid = (ll + rr) / 2;
    17         if (a[mid] <= r)    ll = mid;
    18         else rr = mid;
    19     }
    20     return rr;
    21 }
    22 long long downn(int n, long long l)
    23 {
    24     int ll = 0, rr = n;
    25     while (ll + 1 < rr)
    26     {
    27         int mid = (ll + rr) / 2;
    28         if (a[mid] >= l)    rr = mid;
    29         else ll = mid;
    30     }
    31     return ll;
    32 }
    33 int main()
    34 {
    35     int t;
    36     cin >> t;
    37     while (t--)
    38     {
    39         cin >> n >> m;
    40         memset(a, 0, sizeof(a));
    41         for (int i = 1; i <= n; i++)
    42         {
    43             cin >> a[i];
    44             a[i] = a[i] * a[i];
    45         }
    46         sort(a + 1, a + n + 1);
    47         for (int i = 1; i <= m; i++)
    48         {
    49             cin >> l >> r;
    50             cout << upper_bound(a+1,a+n+1,r)-lower_bound(a+1,a+n+1,l)<< endl;
    51         }
    52     }
    53     return 0;
    54 }
    View Code

    C:Jeff与骰子游戏

    Description

    骰子大家一定都玩过。
    一个骰子有六个面,每个面都有一个数字。对于骰子的每一个面,你都可以通过朝一个方向翻转90度来获得另一个面。




    现在你有一个骰子,一开始朝上的一面点数为1(如图上的第一个骰子所示)。
    你每次都可以将它朝一个方向翻转90度,并获得相当于翻转之后的骰子朝上一面的点数的分数。比如,现在骰子朝上的一面点数为1,你可以通过翻转使它朝上的一面变成3,并获得3分。

    现在给出一个目标分数s,请问你至少需要翻转几次,使得你的分数刚好等于目标分数。

    Input

    题目包含多组测试数据。
    第一行是一个整数T,表示有T组测试数据。
    对于每组测试数据,只有一个正整数s,表示你需要达到的目标分数。(1 <= s <= 10000) 

    Output

    对于每组测试数据,输出达到目标分数至少需要翻转几次,如果无解请输出-1。

    Examples

    Input

    2
    5
    10

    Output

    1 2
    Hint
    对于第二组样例: 你可以先翻转90度,使得骰子朝上的一面变为4,并获得4分。 之后你可以再翻转90度,使得骰子朝上的一面变为6,并获得6分。 所以你至少需要2步来达到目标分数。

    正确解法:

    考试时觉得,每次骰子上面的数不确定,它能翻转到达的数也不确定,要一个一个判断,我觉得很麻烦,不会写,但其实只要不是它本身,和底下的数 7-i  其他的数都可以到达。

    于是就成了一个裸bfs。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<string>
     5 #include<cstring>
     6 #include<algorithm>
     7 using namespace std;
     8 int n;
     9 int book[100100];
    10 struct student
    11 {
    12     int shu, ci,daa;
    13 }que[500100];
    14 int bfs(int n)
    15 {
    16     if (n == 1)    return 0;
    17     memset(book, 0, sizeof(book));
    18     memset(que, 0, sizeof(que));
    19     int head = 1, tail = 2;
    20     que[head].shu = 1;
    21     que[head].ci = 0;
    22     que[head].daa = 0;
    23     book[0] = 1;
    24     while (head < tail)
    25     {
    26         if (que[head].daa == n)    return que[head].ci;
    27         for (int i = 1; i <= 6; i++)
    28         {
    29             if (que[head].shu == i || que[head].shu == 7 - i)
    30                 continue;
    31             if (book[que[head].daa+i] == 0)
    32             {
    33                 que[tail].shu = i;
    34                 que[tail].ci = que[head].ci + 1;
    35                 que[tail].daa = que[head].daa + i;
    36                 book[que[tail].daa] = 1;
    37                 if (que[tail].daa == n)    return que[tail].ci;
    38                 tail++;
    39             }
    40         }
    41         head++;
    42     }
    43     return -1;
    44 }
    45 int main()
    46 {
    47     int t;
    48     cin >> t;
    49     while (t--)
    50     {
    51         cin >> n;
    52         cout << bfs(n) << endl;
    53     }
    54     return 0;
    55 }
    View Code

    我是傻逼,现在觉得这题都好简单。为什么写不出来!

     

    D:Rabbit寻宝记(2)

    Description

    Rabbit成功地打开了大门后,没多久就见到了梦寐以求的宝藏。里面的宝石种类共有N 种,每一种都有一个体积v 和它的价值val 。(已知第i 种宝石的体积为i ,编号从1 ~N )更让Rabbit兴奋的是,每种宝石的数量还是无穷无尽的。
    Rabbit当然想把所有宝石全都带回家,但是她带的袋子却最多只能装下总体积为V 的宝石,所以贪心的Rabbit决定要带走总体积恰好为V 的宝石。
    现在她突然想知道自己在拿走宝石数量恰好为N 的情况下总价值最大为多少?

    Input

    输入数据第一行是一个正整数T ,表示数据组数。(T<=20 )
    每组数据占两行。
    第一行为两个整数NV 。(0<N<=1000N<=V<=min(NN2N) )
    接下来一行有N个整数,代表N种宝石的价值vali 。(0<vali<=10000 )

    Output

    每组测试数据输出一行,代表在满足拿走宝石总体积恰为V 和数量恰好为N 的情况下Rabbit能拿走宝石的最大总价值。

    Examples

    Input

    1
    3 5
    6 2 4

    Output

    16

    正确解法:

    动态规划QAQ不会

    二维的多重背包,就是多加一维然后从0开始
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<string>
     5 #include<cmath>
     6 #include<algorithm>
     7 #include<map>
     8 using namespace std;
     9 int n,V,w[2010],v[1010];
    10 int f[2010][1010];
    11 int main()
    12 {
    13     scanf("%d %d",&n,&V);
    14     for(int i=1;i<=n;i++)
    15     {
    16         w[i]=i;
    17         scanf("%d",&v[i]);
    18     }
    19     memset(f,-9999,sizeof(f));
    20     f[0][0]=0;
    21     for(int i=1;i<=n;i++)
    22         for(int j=0;j<=V;j++)
    23             for(int k=1;k<=n;k++)
    24             {
    25                 if(j>=w[i])
    26                 f[j][k]=max(f[j][k],f[j-w[i]][k-1]+v[i]);
    27             }
    28     printf("%d
    ",f[V][n]);
    29     return 0;
    30 }
    View Code

    (忘了多组测试2333)

    No matter how you feel, get up , dress up , show up ,and never give up.
  • 相关阅读:
    mysql索引
    mysql主从复制(同步)
    MySQL事务与锁
    四大高阶函数
    客户端、服务端通信值统计字符串个数【网络程序设计
    《Unicast QoS Routing Algorithms for SDN Survey 2018》【毕设
    CDQ分治【待补充,数据结构
    KD树学习小结【待补充,数据结构
    线段树模板【数据结构
    【牛客网】牛客练习赛19 F 算式子【数学--递推 、前缀、数字】
  • 原文地址:https://www.cnblogs.com/Kaike/p/9950298.html
Copyright © 2020-2023  润新知