CF 483C Diverse Permutation(构造)

本文介绍了一个编程问题,即如何从1到n的整数中构造一个序列,使相邻元素差的绝对值各不相同且总数恰好为k。文章提供了一种有效的方法来生成这种序列,并附带了实现该算法的C++代码。
C. Diverse Permutation
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

Permutation p is an ordered set of integers p1,   p2,   ...,   pn, consisting of n distinct positive integers not larger than n. We'll denote as nthe length of permutation p1,   p2,   ...,   pn.

Your task is to find such permutation p of length n, that the group of numbers |p1 - p2|, |p2 - p3|, ..., |pn - 1 - pn| has exactly k distinct elements.

Input

The single line of the input contains two space-separated positive integers nk (1 ≤ k < n ≤ 105).

Output

Print n integers forming the permutation. If there are multiple answers, print any of them.

Examples
input
Copy
3 2
output
Copy
1 3 2
input
Copy
3 1
output
Copy
1 2 3
input
Copy
5 2
output
Copy
1 3 2 4 5
Note

By |x| we denote the absolute value of number x.

题意:

从1-n的数中构造出一个序列,使得相邻数的差的绝对值的不同值的个数恰好为k,构造出这样的序列。

思路:

可以发现这样的一件事,当我们有n个数,k=n-1的时候,例如n=5,k=4

我们可以把1放第一个,第二个为1+4=5,第三个是5-3=2,第四个是2+2=4,第五个是4-1=3。这样刚好用了n个数不重复。

所以我们可以想到,前面的我们用递增的序列,保证前面差值均为1,后面再从差值为n-1开始往后按照上面的发现来构造,就一定能构造出这样的序列来。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
int a[maxn];
int main()
{
    int n,k;
    while(~scanf("%d%d",&n,&k))
    {
        int remain=k;
        int i;
        int f=1;
        for(i=1;i<=n-k;i++)
        {
            a[i]=i;
        }
        for(;i<=n;i++)
        {
            if(f)
            {
                f=0;
                a[i]=a[i-1]+remain;
                remain--;
            }
            else
            {
                f=1;
                a[i]=a[i-1]-remain;
                remain--;
            }
        }
        for(int i=1;i<=n;i++)
        {
            if(i==n)
                printf("%d\n",a[i]);
            else
                printf("%d ",a[i]);
        }
    }
    return 0;
}

Diverse-n 是用于评估语言模型输出多样性的一个重要指标。 它主要衡量生成文本中不同 n - 元组(n - gram)的占比情况。n - 元组是指文本中连续的 n 个词组成的序列。例如,当 n = 2 时,就是二元组(bigram),如在句子“我爱自然语言处理”中,二元组有“我爱”“爱自”“自然”“然语”“语言”“言处”“处理”。 计算 Diverse - n 时,会统计生成文本集合中所有不同的 n - 元组的数量,然后除以所有 n - 元组的总数。其公式可以简单表示为: \[ Diverse - n=\frac{\text{不同的 n - 元组数量}}{\text{所有 n - 元组数量}} \] 一个较高的 Diverse - n 值表明生成的文本中包含更多不同的 n - 元组,也就意味着生成结果具有更高的多样性;反之,较低的 Diverse - n 值说明生成文本存在较多重复的 n - 元组,多样性较差。 例如,若语言模型生成了以下两个句子: 句子 1: “苹果很好吃” 句子 2: “苹果很好吃” 当计算 Diverse - 2 时,所有的二元组有“苹果”“果很”“很好”“好吃”,不同的二元组数量为 4,所有二元组数量也是 4,此时 Diverse - 2 = 1。但如果生成的句子多样性增加,如句子 1: “苹果很好吃”,句子 2: “香蕉也美味”,二元组增多且不同二元组数量占比会有变化,Diverse - 2 的值可能会有所不同。 Diverse - n 指标在评估语言模型时非常有用,因为在很多应用场景下,如对话系统、文本生成任务等,需要模型生成多样化的输出。如果模型总是生成相似的内容,会降低用户体验和系统的实用性。通过 Diverse - n 可以直观地了解模型生成结果的多样性程度,帮助研究者和开发者改进模型,提高其生成多样化文本的能力。 ```python from collections import Counter def get_n_grams(text, n): words = text.split() n_grams = [] for i in range(len(words) - n + 1): n_gram = ' '.join(words[i:i + n]) n_grams.append(n_gram) return n_grams def diverse_n(texts, n): all_n_grams = [] for text in texts: n_grams = get_n_grams(text, n) all_n_grams.extend(n_grams) unique_n_grams = set(all_n_grams) if len(all_n_grams) == 0: return 0 return len(unique_n_grams) / len(all_n_grams) # 示例使用 texts = ["苹果很好吃", "香蕉也美味"] diverse_2 = diverse_n(texts, 2) print(f"Diverse - 2: {diverse_2}") ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值