暑假第一次积分赛

A 辞树的QAQ水题
题目描述 蒟蒻的辞树又被吊打了嘤嘤嘤。留下了属于弱者的眼泪QAQAQAQAQAAQAAQA······ 现在我 们定义辞树的悲伤值 F 。F的值为主串中子序列为”QAQ”的个数。注意字母“QAQ”不一定是 连续的,但是字母的顺序应该是准确的。
输入 输入一个整数T(0 ≤ T ≤ 20),代表有T组数据。每组数据会给出一个字符串S,长度为len,0 < len ≤ 1000000
输出
根据每组的字符串,输出辞树的悲伤值F,每组数据换行。
输入样例
2

QAQAQYSYIOIWIN

QAQQ
输出样例
4

2

解题思路 :

    此题关键在于  "QAQ" 不一定是连续的 , 所以 可以发现 ,

  当 一个  A  前 的 Q 的数量 为 L ,后面 Q 的数量为 R 时 ,其 所构成的 QAQ 序列 的数量 一定是 L * R 。

  故 我们 以 A 为 中心 ,分析 并 记录 每一个  A 前后Q 的数量 L 和 R ;以 结构体 表示 为 a[i].L  和 a[i].R  

 其所 构成的 QAQ 的 总数量 就为 sum :

  伪代码

                                              for    i     in    n :

扫描二维码关注公众号,回复: 2537185 查看本文章

                                                     sum += a[i].L *   a[i].R ;

B 排序去重
时间限制 内存限制 出题人 1 Second 512 Mb 
问题描述
用计算机生成了N个1到1000之间的随机整数(1≤N≤1000 ),对于其中重复的数字,只保留一 个,把其余相同的数去掉,然后再把这些数从小到大排序。
输入
多组输入,有2行,第1行为1个正整数,表示所生成的随机数的个数: N 第2行有N个用空格隔开的正整数,为所产生的随机数。
输出
也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整 数,为从小到大排好序的不相同的随机数
输入样例
15

5 8 55 2 6 4 7 56 47 18 222 546 254 56 32
输出样例
14 2 4 5 6 7 8 18 32 47 55 56 222 254 546
 

在此 就不说了,一个简单的  set  集合去重应用   ,谁做谁开心

 C 简单的划分问题
时间限制 内存限制 出题人 1 Second 512 Mb 
题目描述
A国有一支由n个人组成的小队,小队中每个人的位置是固定的,并且每个人都有对应的能力 值,这些人的能力值构成一个序列,现在A国要将这一支小队分为x个小组,并对这x个小组进 行能力分析,这x个小组每个小组都有一个最低能力值,一共x个,问怎样划分才能使这x个能力 最弱的人中能力值最高的那个人的能力值最大,并输出这个最大值
输入
多组输入,处理到文件结束 第一行输入n和x,1 < n <= 1500,1 <= x <= n <= 1500,代表人数和要划分的组数 第二行输入n个整数,代表n个人的能力值
输出
最大的能力值
输入样例
8 1 1 2 3 4 5 9 3 6
输出样例
1
输入样例
7 6 997 425 851 236 789 527 195
输出样例
997
注意
划分小组时人的位置顺序不能改变

解题思路

   当 x==1时,发现只能取最小值min

   当x==n时,发现我们可以把每一个人分为一组,故可以取最大值max

   当x==2时,分为三种情况

             第一种,将第一个人作为一组,将后面的人分为一组

             第二种,将最后一个人作为一组,前面的人为一组

             第三种,从中间分开,作为两组

         可以发现,我们取第一个人和最后一个人中最大的值

  当x==3时,我们可以把最大的值孤立作为一组,故取最大值max

  当x >3 时,同上

D NHK协会的阴谋
时间限制 内存限制 出题人 1 Second 512 Mb 
题目描述
“阴谋啊,这一定是NHK协会的阴谋” 事实上,NHK协会是真实存在的,NHK协会会为每个人分配一个特征码(只包含大写字母的 字符串)以及一个改变系数Q。然后NHK协会会根据以下规则将满足条件的人列为NEET:规定特 征码中所有的0N0,0H0,0K0最多能组合成”NHK”的个数为P 。要求1.P > K 2.Q < L; K,L是常 数。找出真正的NEET之后,对这些人按以下规则排序:对每个人计算出X = P∗(L−Q),按X由 大到小对这些人进行排序,对于X相同的人按照姓名字典序最小排序,保证给出的姓名都不相 同。
输入 T(1 ≤ T ≤ 100)组数据第二行输入K,L,M,K,L依次对应题目描述中的K,L。 M表示一共M个 人然后M行每行输入每个人的信息依次为姓名,特征码,改变系数Q. 姓名是长度不超过20的字符 串,特征码是长度不超过1000的字符串,输入的数值均为正整数。 1 ≤ M ≤ 100,1 ≤ L ≤ 100,1 ≤ K,Q ≤ 10
输出
对排好序且满足条件的人的姓名分别输出一行如果没有NEET则输出”FINE!”输出不包含引号
输入样例
2

3 28 3

SAKI DDDDD 4

ABB NDSHKHHKKNN 3

BCC HHKKNN 5
4 36 3

SATO NHKNHKNHKNHKNHKNHK 1

QUEEN NHKNHKQRNRHRKHNRKNHK 8

DIOOO WRYYYYYNHKNHKNHKKHNNHK 5
输出样例
FINE!
SATO

DIOOO

QUEEN

解题思路

    分别统计序列中 H  ,K ,N 的数量,组成 NHK 序列 的数量 就是 三者数量的最小值

    其次,便是对map容器的应用,即 map< string, map< string ,int >

E Pair and Straight
时间限制 内存限制 出题人 3 Second 32768 kB 
题目描述
人生当苦无妨,良人当归即好。 —《雪中悍刀行》
我们现在有很多很多很多数字,现在我们想知道这些数字里面有最多有多少个 P 与 S。
我们定义 P的含义为大小相同的两个数字的个数,例如一组数字里面有两个1 那么这两个1就 是一个P,四个1,那么就是2个P。 S的含义为连续的是三个数字,例如1,2,3就是一个S。
还请acmer 请将可以得到的最多的P与S输出
输入 第1行输入T(1 ≤ T ≤ 20)组数据 第2行输入n(1 ≤ n ≤ 1e5) 第3行输入n个数字x(1 ≤ x ≤ n),
输出
输出最多的 P + S
输入样例
4

7

1 2 3 4 5 6 7

9

1 1 1 2 2 2 3 3 3

6

2 2 3 3 3 3

6

1 2 3 3 4 5
输出样例
2

4

3

2

HINT

Case 1(1,2,3)(4,5,6)

Case 2(1,2,3)(1,1)(2,2)(3,3)

Case 3(2,2)(3,3)(3,3)

Case 4(1,2,3)(3,4,5)

解题思路

       该题  是贪心的思想,因 P 和 S 等价 ,构成一个P 需要 需要两个数,构成一个S 则需要三个数,根据贪心算法,取最优解,先取 P的数量,再求S 的数量
 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <stdio.h>
#include <string.h>
 
using namespace std;
 
const int N = 1e6+10;
int data[N];
 
int main()
{
    int n,a,t;
    cin >> t;
    while(t--) {
    	cin >> n;
        memset(data, 0, sizeof(int) * (n + 2));
        for(int i = 1; i <= n; i++) {
        	cin >> a;
            data[a]++;
        }
        long long ans = 0;
        for(int i = 1; i <= n; i++) {
            ans += data[i] / 2;
            data[i] %= 2;
            if(data[i - 1] && data[i] && data[i + 1]) {
                ans++;
                data[i- 1]--;
                data[i]--;
                data[i + 1]--;
            }
        }
        cout << ans << endl; 
    }
    return 0;
}

F 画线条
时间限制 内存限制 出题人 1 Second 512 Mb 
题目描述
zxy无聊的在纸上划着线条,队友不能容忍,于是借机给他出了一个简单的问题,让他把自己画 的n线条选择一部分摆到数轴上,且两两没有重合,然后问他最大的摆放数量k
输入
第一行为一个正整数 n; 在接下来的 n 行中,每行有 2个数 ai,bi描述每条线段。 n,ai,bi(0 < n,ai,bi ≤ 106)
输出
输出一个整数,为 k的最大值。
输入样例
3

0 2

2 4

1 3
输出样例
2

解题思路

            先将结构体定义的数组,按右端点进行从小到大的排序。

            当为第一个元素时,与第二个元素进行对比,就是第一个的右端点,小于第二个的左端点时,说明两区间没有相交,数量k+1,并更新右端点(将第二个的右端点更新为右端点);以此类推。。。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;

typedef long long ll;
struct node
{
    ll l,r;
}data[200002];
bool cmp(node x,node y)
{
    return x.r<y.r;
}
int main()
{
    ll t,n,m,s,res,i;
        cin >> n;
        for(i=0;i<n;i++){
            cin >>data[i].l >>data[i].r;
        }
        sort(data,data+n,cmp);
        s=data[0].r;
        res=1;
        for(i=1;i<n;){
            if(data[i].l>=s){
                res++;
                s=data[i].r;
                i++;
            }
            else i++;
        }
        cout << res << endl;
    return 0;
}

G 又是毕业季
时间限制 内存限制 出题人 1 Second 512 Mb 
题目描述
为了把毕业晚会办得更好,老师想要挑出默契程度最大的k个人参与毕业晚会彩排。可是如何挑 呢?老师列出全班同学的号数1,2,……,n,并且相信k个人的默契程度便是他们的最大公约数 (这不是迷信哦 )。这可难为了他,请你帮帮忙吧! PS:一个数的最大公约数即本身。
输入
多组输入,两个空格分开的正整数n和k。(n大于等于k,k大于等于1)
输出
一个整数,为最大的默契值。
输入样例
4 2
输出样例
2
提示
对于20%的数据,k小于等于2,n小于等于1000 对于另30%的数据,k大于等于10,n小于等于100 对于100%的数据,k小于等于1e9,n小于等于1e9(神犇学校,人数众多)

解题思路

      n / k 就是我们要的答案,得到 最大公约数  a  , a * i (  1 <= i <= k  ) <= n;

H X and Y
时间限制 内存限制 出题人 1 Second 512 Mb 
题目描述
已知:
      
y1 = k·x1

y2 = k·x2

z = min{y1·y2/k^2 }

y 1,y2,k,x1,x2 ∈ Z+


给定 y1,y2 求 z
输入 多组输入,每行输入两个数字:y1,y2,请求到文件结束(EOF) 0 < y1,y2 < 231
输出
每行输出一个整数 z ,最后一组输出数据末尾没有换行符
输入样例
3 2

3 5

2 7
输出样例
6

15

14
解题思路

    本题就是求 y1 与 y2 的最大公约数 k ,从而使 k^2 最大,z 最小

I Sequence Of Number
时间限制 内存限制 出题人 1 Second 512 Mb 
题目描述
有一个由n个数组成的数列,但其中缺少一项,请你任意添加该项,使整个数列的值y和下标x (1 : n)满足函数:y = kx + b. 其中k,b是不为0的整数. 如果满足,输出YES,并输出数列缺少的那一项的最小值,否则,输出NO. ps: 数列是由一列有序的正整数组成的连续数字.
输入 第一行一个T,表示T组测试数据.(1 ≤ T ≤ 100) 每一组数据分两行,第一行一个整数 N,第二行是由N−1个数组成的正整数数列. (1 ≤ N ≤ 3) 输入的所有数据不超过int,且为正整数.
输出
若满足输出YES,并输出数列缺少的最小数字,否则输出NO.
输入样例
1 2 3
输出样例
YES 1
样例解释
输入数3的下标可能是1 or 2,当是1的时候,缺项可以是1 2 4 5 7...取最小值为1;当下标为2的 时候,缺项可以是1 2 4 5 6 7...取最小值为1;
解题思路

     本题要点是 数列构成的直线不过原点;   使数列 构成 递增 与 递减 两种 分别进行分析

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

typedef long long LL;
const int MAXN = 1e5 + 10;
LL a[MAXN];

int main() {
    int n, T;
    scanf("%d", &T);
    while(T--) {
        scanf("%d", &n);
        for(int i = 1; i < n; ++i) scanf("%lld", &a[i]);
        if(n == 1) puts("YES 1");
        else if(n == 2) {
            if(a[1] == 1) puts("YES 2");
            else puts("YES 1");
        }
        else if(n == 3) {
            LL cnt = -1;
            LL ans = a[2] - a[1];
            if(ans > 0) {
                if(a[1] - ans > 0 && a[1] - ans != ans) cnt = a[1] - ans;
                else if(ans % 2 == 0 && a[1] - ans / 2 != 0) cnt = a[1] + ans / 2;
                else if(a[1] - ans != 0) cnt = a[2] + ans;
            }
            else if(ans < 0) {
                if(a[2] + ans > 0) cnt = a[2] + ans;
                else if(ans % 2 == 0) cnt = a[1] + ans / 2;
                else cnt = a[1] - ans;
            }
            if(cnt == -1) puts("NO");
            else printf("YES %lld\n", cnt);
        }
    }
    return 0;
}

J Jack与Pony的战斗
时间限制 内存限制 出题人 1 Second 512 Mb 
题目描述
Jack和Pony分别是两股势力的头目,一直以来他们之间总是冲突不断。最近他们又开始了T轮 新的竞争,在每轮竞争中他们会进行多次的PK。在每轮竞争前他们的起始积分都为0,在每 次PK中,赢的一方会加2x积分,输的一方会加x积分(注:x为一个任意正整数)。然后针对 每轮竞争GM会给出两个值m,n,判断经过这轮的多次PK他们两个的积分是否能得到这两个值。 若能得到则输出“Yes”,若不能得到则输出“No”。
输入 输入包含T轮竞争(1 ≤ T ≤ 100)。每轮竞争输入两个整数 m,n(1 ≤ m,n ≤ 10000000)。
输出
对于每轮竞争,若经过数次PK他们两人的积分能得到GM给出的值,则输出“Yes”,否则输出 “No”。
输入样例
3 10 5 121 123 12 100000
输出样例
Yes No No
解题思路

     设  J 赢得场数为 a,那么 J 获得 a* 2x, P获得 a * x,

           P 赢得场数为 b ,那么 J 获得 b * x, P获得 b *2 x,

     综上,J的分数为   a * 2x + b * x = m

                 P的分数为  a * x  + b * 2x = n   ,    因 a,b 都是整数,故我们可以将 a * x 当成 a ,b * x 当成 b ,两方程联立解 a ,b

        若 a,b >=0 说明有解,否则无解

猜你喜欢

转载自blog.csdn.net/hnlg311709000526/article/details/81176807
今日推荐