hz错题笔记

1. 挑战队员

题目描述

鸣人所教班级的 MM 名学生都非常优秀,学习成绩差别不大,现在要选出不少于 NN 名学生参加一项夏令营活动,但以什么标准挑选让鸣人犯了难。为了体现公平,鸣人进行了一次综合测评,他希望找到的这些同学的测评成绩必须是相同的,而且越高越好,对同一测评分数的学生,要么都选上,要么都不被选。加入得到的测评成绩一定能满足鸣人的要求,请你编写程序帮助鸣人计算按照上述规则能够挑选出多少名学生。


输入

输入共有 M+2M+2 行:

第一行:只有一个正整数MM ,表示参与测评的学生人数(其中 2≤M≤1002≤M≤100 )

接下来的 MM 行:每行一个正整数,表示 名学生的测评成绩(不超过 100100 );

最后一行:包含一个正整数 NN ,表示杨老师希望挑选的最少人数。

输出

输出包含一个正整数,表示杨老师实际挑选出来的队员人数。


样例输入1
8
98
94
94
96
91
92
91
91
2
样例输出1
2

数据规模与限定

时间限制:1 s

内存限制:64 M

#include <iostream>
#include <algorithm>
using namespace std;
bool cmp (int a, int b) {
    return a > b;
}
int main() {
    int n, a[105], w;
    scanf("%d", &n);
    for(int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }
    scanf("%d", &w);
    sort(a, a + n, cmp);
    
    int t = 1, sum = a[0];
    for(int i = 1; i < n; i++) {
        if(a[i] == sum){
            t++;
            if(t >= w && a[i + 1] != a[i]) {
                break;
            }
        } else {
            t = 1, sum = a[i];
        }
    }
printf("%d\n",t);
return 0;
}

2. 抢气球(双指针算法)

题目描述

教室的墙上挂满了气球,五颜六色,小朋友们非常喜欢。

刚一下课,小朋友们就打算去抢这些气球。每个气球在墙上都有一定的高度,只有当小朋友跳起来时,手能够到的高度大于等于气球的高度,小朋友才能摘到这个气球。为了公平起见,老师让跳的低的小朋友先摘,跳的高的小朋友后摘。小朋友都很贪心,每个小朋友在摘气球的时候都会把自己能摘的气球都摘掉。

很巧的是,小朋友们跳起来手能够着的高度都不一样,这样就不会有跳起来后高度相同的小朋友之间发生争执了。


输入

第一行输入两个空格分隔的整数 n,m(1≤n,m≤100000)n,m(1≤n,m≤100000) ,其中 nn 表示小朋友的数量,mm 表示墙上气球的数量。

第二行输入 nn 个正整数(每两个整数之间用空格隔开),第 ii 个数为 ai(1≤ai≤109)ai(1≤ai≤109),表示第 ii 个小朋友跳起来手能够着的高度为 aiai 。

第三行输入 mm 个正整数(每两个整数之间用空格隔开),第 ii 个数为hihi ,表示第 ii 个气球的高度为 hihi。

输出

输出一共 nn 行,每行一个整数。 第ii 行表示第 ii 个小朋友摘到的气球数量。


样例输入1
5 6
3 7 9 6 4
1 2 3 4 5 6
样例输出1
3
0
0
2
1
样例解释1

对于第一组样例输入,摘取气球的顺序依次为 1,5,4,2,31,5,4,2,3 号小朋友。11 号小朋友能摘1,2,31,2,3号气球,55 号小朋友能摘 44 号气球,44 号小朋友能摘 5,65,6 号气球, 2,32,3 号小朋友没有气球可摘了。

样例输入2
10 10
1 2 3 4 5 6 7 8 9 10
3 1 4 6 7 8 9 9 4 12
样例输出2
1
0
1
2
0
1
1
1
2
0

数据规模与限定

时间限制:2 s

内存限制:64 M

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 100010;
struct Node{
    int v;
    int index;
}s[N];
int b[N], c[N];
bool cmp(Node a, Node b) {
    return a.v < b.v;
}
int n, m;
int main() {
    
    cin >> n >> m;
    for(int i = 0; i < n; i++) {
        cin >> s[i].v;
        s[i].index = i;
    }
    for(int i = 0; i < m; i++) {
        cin >> b[i];
    }
    sort(s, s + n, cmp);
    sort(b, b + m);
    int num = 0;
    for(int i = 0; i < n; i++) {
        while(num < m && s[i].v >= b[num]) {
                c[s[i].index]++;
                num++;
        }
    }
    for(int i = 0; i < n; i++) {
        cout << c[i] << endl;
    }
    return 0;
}

##3.方程求解

题目描述

有一个如下的方程需要你帮忙计算一下。

x*e^x=a

请你求出满足等式的 x 的值。


输入

输入一个整数a(0≤a≤10^9)。

输出

输出一个浮点数,表示方程的解,四舍五入到小数点后四位。


样例输入1
0
样例输出1
0.0000
样例输入2
1
样例输出2
0.5671
样例输入3
100
样例输出3
3.3856
数据规模与限定

时间限制:1 s

内存限制:64 M

#include<iostream>
using namespace std;
#include<cmath>
#include<iomanip>
int a;
double brearch_3(double l, double r)
{
  const double eps = 1e-7;
  while(r - l > eps)
  {
    double mid = (l + r) / 2;
    if(mid * exp(mid) > a)r = mid;
    else l = mid;
  }
  return l;
}
int main() {
    cin >> a;
    cout <<fixed<<setprecision(4) << brearch_3(0, a) << endl;
    return 0;
}

4.报数游戏

题目描述

路飞在和他的朋友们一起玩一个游戏。由于路飞的机智,这个游戏由路飞担任裁判。

首先,路飞会给他们一人一个编号,并且每个人的编号都不相同。接下来的每一回合,会给一个数,编号不超过它的最大编号的人要报出自己的编号。如果没有人的编号比路飞给出的数要小,那么编号最小的人要报出自己的编号。每个人可以重复报号。

路飞会按照一个列表顺次报出每个回合的数,他的朋友们想知道每回合报出的编号应该是多少。你能帮帮他们吗?


输入

输入数据共 33 行。

第一行有两个整数 n,m(1≤n≤105,1≤m≤105)n,m(1≤n≤105,1≤m≤105) ,分别表示参与游戏的路飞朋友的个数,和游戏的回合数。 第二行 nn 个整数 ai(1≤ai≤108)ai(1≤ai≤108),表示朋友们每个人的编号。对于 0≤i<j<n0≤i<j<n ,都有 ai<ajai<aj ,即他们的编号递增排列。 第三行 m 个整数 qi(1≤qi≤108)qi(1≤qi≤108) ,表示每回合路飞给的数字。

输出

输出共一行 m 个整数,表示每回合报出的编号,每两个整数之间一个空格,最后一个数后面没有空格。


样例输入1
5 5
1 5 10 15 20
3 6 12 18 24
样例输出1
1 5 10 15 20

数据规模与限定

时间限制:1 s

内存限制:64 M

#include<iostream>
using namespace std;
int a[100005];

int erfen(int l, int r, int x) {
    while(l < r)  {
        int mid = l + r+1 >> 1;
        if(a[mid] <= x) l = mid;
        else r = mid - 1;
    }
    return a[l];
}
int main() {
    int n, m;
    cin >> n >> m;
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    int t;
    for(int i = 1; i <= m; i++) {
        cin >> t;
        if(i != m)cout << erfen(1, n, t)<<' ';
        else cout << erfen(1, n, t);
    }
    return 0;
}

5.N!分解因子

题目描述

给定整数 N(1≤N≤106)N(1≤N≤106),试把阶乘 N!N! 分解质因数,按照算术基本定理的形式输出分解结果中的 pi 和 ci 即可。


输入

一个整数 N。

输出

N! 分解质因数后的结果,共若干行,每行一对 pi,cipi,ci,表示含有pici 项。按照 pi 从小到大的顺序输出。


样例输入
5
样例输出
2 3
3 1
5 1
样例说明

5!=120=23∗31∗515!=120=23∗31∗51


数据规模与约定

时间限制:1 s

内存限制:256 M

100% 的数据保证 1≤N≤106

#include <stdio.h>
#define N 1000010
#include <string.h>
#include <stdbool.h>
int cnt[N];
bool a[N];
int b[N], w;
void is_prime(int k) {
    memset(a, 0, sizeof(a));
    for(int i = 2; i <= k; i++) {
        if(!a[i]) {
            b[w++] = i;
        }
        for(int j = 0; j < w && i * b[j] <= k; j++) {
            a[i * b[j]] = 1;
            if(i % b[j] == 0) break;
        }
    }
}
int main()  {
    int n;
    scanf("%d", &n);
    for(int i = 2; i <= n; i++) { // 暴力
    int num = i;
    for(int j = 2; j * j <= num; j++) {
       if(num % j) continue;
        while(num % j == 0) {  // 分解合数的质数因子
            cnt[j]++;
            num /= j;
        }
        cnt[num]++;
    }
    cnt[i]++;
    }
    is_prime(n);
    for(int i = 0; i < w; i++) {
        printf("%d %d\n", b[i], cnt[b[i]]);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值