codeforces 202B Brand New Easy Problem

本文介绍了一种通过全排列和逆序数计算解决特定字符串匹配问题的方法。使用next_permutation函数实现字符串全排列,计算不同排列下的逆序数并与示例集匹配,寻找最优解。

      题目的意思就是说给定不超过四个词的句子,将这几个次进行全排列,然后在去下面给出的例子中进行匹配,如果某个全排列匹配成功的话,就求出其逆序数,找到符合情况的逆序数最小的情况,如果有多的选择,则选择编号最小的情况,并按照给定的格式进行输出。

     题目中说到就是子串中的单词不会重复,但是匹配串会有单词重复,如果说去每个匹配串中找到相应的单词,并求出所有可能的逆序的话,这样的任务量会很大。不如就是把子串所有的全排列全部匹配一遍,这样的话会省去很多判断的过程,对于编码和时间都会有很大的改善。

     那么这道题的主要思路就是用到next_permutation()函数将子串进行全排列,然后把每种情况的逆序数求出来,然后和匹配串一一匹配,然后再重中找到最终的解。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

struct node
{
    char s[21][25];
    int k;
} v[10];

int main()
{
    int n,m,k,f[4];
    scanf("%d",&n);
    char a[4][20];
    for(int i=0; i<n; i++)
        scanf("%s",a[i]);
    scanf("%d",&m);
    for(int i=0; i<n; i++)
        f[i]=i;
    for(int i=0; i<m; i++)
    {
        scanf("%d",&v[i].k);
        for(int j=0; j<v[i].k; j++)
            scanf("%s",v[i].s[j]);
    }
    int p=20,ans=10000;
    do
    {
        int sum=0,i;
        for(i=0; i<n; i++)
            for(int j=0; j<i; j++)
                if(f[j]>f[i]) sum++;
        if(sum>ans) continue;
        for(i=0; i<m; i++)
        {
            int k=0,j;
            for(j=0; j<v[i].k&&k<n; j++)
                if(strcmp(a[f[k]],v[i].s[j])==0) k++;
            if(k>=n) break;
        }
        if(i<m&&(sum<ans||sum==ans&&p>i)) p=i,ans=sum;
    }
    while(next_permutation(f,f+n));
    if(p==20) printf("Brand new problem!\n");
    else
    {
        printf("%d\n[:",p+1);
        int t=n*(n-1)/2+1-ans;
        for(int i=0; i<t; i++) printf("|");
        printf(":]\n");
    }
    return 0;
}


 

 

### 关于 Codeforces 上二项装箱问题 #### 二项装箱问题概述 二项装箱问题是经典的组合优化问题之一,在计算机科学领域具有重要意义。该类问题通常涉及将一组不同大小的对象放入固定容量的容器中,目标是最小化使用的容器数量[^1]。 对于特定平台上的挑战实例,如Codeforces中的二项装箱问题,其核心在于设计高效算法来解决这一NP难问题。尽管找到最优解可能非常复杂,但存在多种启发式方法可以提供接近最佳的结果,并且这些方法能够在合理的时间内执行完毕。 #### 解决方案策略 一种常见的处理方式是采用贪心算法,即总是尝试把当前最大的未分配物品放置到第一个能够容纳它的箱子中;如果没有任何现有箱子能放下这件物品,则创建一个新的箱子用于装载它。这种方法简单易懂,但在某些情况下可能会导致次优解。 更复杂的近似算法包括首次适应下降(First Fit Decreasing, FFD),此技术首先按照降序排列所有项目尺寸,之后应用首次适配原则(FD)。FFD已被证明能在多项式时间内给出不超过理想最小值11/9倍数加四的解法质量保证[^2]。 此外还有其他高级求解途径比如动态规划、分支限界以及遗传算法等,它们各自适用于不同的应用场景并提供了不同程度上的性能改进。 ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int n; cin >> n; vector<int> items(n); for(int i = 0; i < n; ++i){ cin >> items[i]; } sort(items.begin(), items.end(), greater<int>()); const int bin_capacity = 1000; // 假设每个bin的最大容量为1000单位体积 vector<int> bins; for(auto item : items){ bool placed = false; for(auto& b : bins){ if(b + item <= bin_capacity){ b += item; placed = true; break; } } if(!placed){ bins.push_back(item); } } cout << "Minimum number of bins required is: " << bins.size(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值