小红的构造数组

文章讲述了如何使用C++编程语言构造一个数组,满足特定条件:数组元素1到n填充,剩余部分均匀分配并确保不超过给定值k。关键策略是先填充数组,然后根据剩余数量对后续元素逐个增加。
摘要由CSDN通过智能技术生成

小红的构造数组

在这里插入图片描述
在这里插入图片描述

C++代码
#include <iostream>
#include <vector>

using namespace std;

int main() {
    int n;
    long long k, x;
    cin >> n >> k >> x;

    long long s = ((long long)n) * (n + 1) / 2;
    if (s > x || n > k) {
        cout << "-1" << endl;
    } else {
        vector<long long> arr(n + 1);
        for (int i = 1; i <= n; i++) {
            arr[i] = i;
        }

        x -= s;
        long long d = x / n;
        long long v = x % n;

        for (int i = 1; i <= n; i++) {
            arr[i] += d;
            if (n - i < v) {
                arr[i]++;
            }
        }

        // 对数组进行最后的check,保证每个元素都小于等于k
        bool ok = true;
        for (int i = 1; i <= n; i++) {
            if (arr[i] > k) ok = false;
        }
        
        if (!ok) cout << "-1" << endl;
        else {
            for(int i = 1; i <= n; i++){
                cout << arr[i] << (i < n ? ' ' : '\n');
            }
        }
    }

    return 0;
}
思路:

先安排1~n填充,即arr[i] = i

那这样还剩余:left = x - (n+1)*n/2

那如何处理这个剩余的部分呢?

其实可以对n进行乘除

d = left / n
r = left % n

把d赋值给每个元素,然后r这个尾巴相当于给最后的r个元素额外+1


小声哔哔,我也没写出来,看了挺多题解的,这个思路是最简单的了,但肯定不是唯一的构造方法。
兄弟们可以试着去证明一下,为什么这样一定能得到满足要求的数组。
我个人思考最关键的提示就是数组元素不能重复,而我们是1~n大小构造起始数组的,如果前面数据增加就一定会和后面的数据重叠,除非你将后面重叠的数据全部增加,但这样数字大小最后一定会超过n,既然这样我为什么不每一个都加d呢,余下的r个数再分别加1,不就构造出满足要求的数组了嘛。
以上可以看作是充分性的“证明”,必要性估计就没有了~

小红想要通过组合小写字母来构建一个最长的单词,其中不许有两个连续的辅音字母。在C语言中,可以设计一个函数来实现这个目标。首先,需要定义一个包含所有元音字母的小数组,然后遍历给定的所有字符,检查每个字符是否为元音,如果当前字符是元音,并且前一个字符不是元音,则可以继续添加到单词中,直到遇到下一个辅音。 以下是简单的C语言代码示例: ```c #include <stdio.h> #include <stdbool.h> #include <ctype.h> // 包含ASCII码判断函数 // 定义元音数组 const char vowels[] = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'}; bool is_vowel(char c) { return strchr(vowels, toupper(c)) != NULL; } int max_palindrome_length(char* str) { int len = strlen(str); bool prev_consonant = false; // 标记前一个字符是否为辅音 int maxLength = 0; for (int i = 0; i < len; ++i) { if (is_vowel(str[i])) { // 如果是元音 if (!prev_consonant) { // 如果前一个不是辅音,可以形成一个有效的单词片段 maxLength += 1; prev_consonant = false; // 清除标记 } } else { // 如果是辅音 prev_consonant = true; } } return maxLength; } int main() { char input[100]; printf("请输入字符串:"); fgets(input, sizeof(input), stdin); input[strcspn(input, "\n")] = '\0'; // 移除fgets带来的换行符 int longestPalindromeLength = max_palindrome_length(input); printf("最长的单词长度为:%d\n", longestPalindromeLength); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值