AcWing第52场周赛

题目列表

AcWing 4422. 智力测试

题目描述

某次智力测试包含无限多的题目,编号依次为 1,2,3…
完成第 i 道题目所需要的时间为 i(i+1)2。

测试的总时长为 n。

请计算,在规定时间内,从第 1 题开始按顺序答题,最多可以完成多少道题目?

输入格式
一个整数 n。

输出格式
一个整数,表示可以完成的最大题目数量。

数据范围
前三个测试点满足 1≤n≤25。
所有测试点满足 1≤n≤104

输入样例1:
1
输出样例1:
1
输入样例2:
25
输出样例2:
4

分析

可以直接模拟解决本题,t(i) = i * (i+1) / 2,从i = 1开始枚举,直到t(1) + t(2) + … + t(i) > 为止,最多可以完成的题目数量就是i - 1。
当然也可以直接推公式,有i2 和i的求和公式,很容易求出二者之和的求和公式。

代码

#include <iostream>
using namespace std;
int main(){
    int n;
    cin>>n;
    int sum = 0,i = 0;
    while(sum <= n) {
        i++;
        sum += i * (i + 1) / 2;
    }
    cout<<i - 1<<endl;
    return 0;
}

AcWing 4423. 最近距离

题目描述

给定一个长度为 n 的整数数组 a1,a2,…,an。

对于每个整数 i(1≤i≤n),请你找到一个整数 j,要求:

1≤j≤n
aj=0
在满足以上两个条件的情况下,|i−j| 应尽可能小。|i−j| 的最小可能值不妨用 bi 来表示。
请你计算并输出 b1,b2,…,bn。

保证给定数组中一定存在 0。

输入格式
第一行包含整数 n。

第二行包含 n 个整数 a1,a2,…,an。

输出格式
一行,n 个整数 b1,b2,…,bn。

数据范围
前 4 个测试点满足 1≤n≤10。
所有测试点满足 1≤n≤2×105,−109≤ai≤109

输入样例1:
9
2 1 0 3 0 0 3 2 4
输出样例1:
2 1 0 1 0 0 1 2 3
输入样例2:
5
0 1 2 3 4
输出样例2:
0 1 2 3 4
输入样例3:
7
5 6 0 1 -2 3 4
输出样例3:
2 1 0 1 2 3 4

分析

题目要求输出数组中每个元素与其最近的0元素之间的距离,最近的0元素要么在其左边要么在其右边,也可以是其本身。所以左右扫一遍数组,记录下0元素最新出现的位置的同时保存下离每个元素最近的0元素的位置即可。

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 200005;
int a[N],l[N];
int main() {
    int n;
    scanf("%d",&n);
    int p = -1e9;
    for(int i = 0;i < n;i++) {
        scanf("%d",&a[i]);
        if(!a[i])   p = i;
        l[i] = p;
    }
    p = 1e9;
    for(int i = n - 1;i >= 0;i--) {
        if(!a[i])   p = i;
        a[i] = min(p - i,i - l[i]);
    }
    for(int i = 0;i < n;i++)    printf("%d ",a[i]);
    return 0;
}

AcWing 4424. 等式

题目描述

给定一个非负整数 d,请你找到两个非负实数 a,b,使得等式 a+b=d 和 a×b=d 同时成立。

输入格式
第一行包含整数 T,表示共有 T 组测试数据。

每组数据占一行,包含一个整数 d。

输出格式
每组数据输出一行答案:

如果存在满足条件的 a 和 b,则首先输出一个字母 Y,随后输出任意一组满足要求的 a 和 b。
如果不存在满足条件的 a 和 b,则输出一个字母 N。
只要你输出的 a 和 b 能够同时满足 |(a+b)−a×b|≤10−6 以及 |(a+b)−d|≤10−6,就视为正确。为了保证精度,建议输出结果保留10位小数。

数据范围
前三个测试点满足 1≤T≤10。
所有测试点满足 1≤T≤1000,0≤d≤1000。

输入样例:
10
0
1
2
3
4
5
6
7
8
9
输出样例:
Y 0.0000000000 0.0000000000
N
N
N
Y 2.0000000000 2.0000000000
Y 3.6180339754 1.3819660246
Y 4.7320508212 1.2679491788
Y 5.7912878394 1.2087121606
Y 6.8284271359 1.1715728641
Y 7.8541019708 1.1458980292

分析

本题要解一个方程组,将b = d - a带入ab = d,可得,ab = ad - a2 = d,即a2 - da + d = 0; 也就是一个一元二次方程,delta = d2 - 4d,由于d非负数,所以d >= 4时,方程有两个解,d = 0时,a = b = 0;方程有解时,delta = sqrt(d2 - 4d) < d,所以不论是(d + delta) / 2还是(d - delta)/ 2都是大于0的,取其中一个解求出b即可,不难发现求出的b也是大于0的,因为两个解a都不超过d。

代码

#include <cstdio>
#include <cmath>
using namespace std;
int main(){
    int T,d;
    scanf("%d",&T);
    while(T--) {
        scanf("%d",&d);
        double delta = d * d - 4 * d;
        if(!d)  puts("Y 0.0000000000 0.0000000000");
        else if(d < 4)  puts("N");
        else {
            delta = sqrt(delta);
            double a = (delta + d) / 2;
            double b = d - a;
            printf("Y %.10lf %.10lf\n",a,b);
        }
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值