USACO [2.1] Sorting a Three-Valued Sequence

Sorting a Three-Valued Sequence
IOI'96 - Day 2

Sorting is one of the most frequently performed computational tasks.Consider the special sorting problem in which the records to be sortedhave at most three different key values. This happens for instancewhen we sort medalists of a competition according to medal value, thatis, gold medalists come first, followed by silver, and bronze medalistscome last.

In this task the possible key values are the integers 1, 2 and 3.The required sorting order is non-decreasing. However, sorting has tobe accomplished by a sequence of exchange operations. An exchangeoperation, defined by two position numbers p and q, exchanges the elementsin positions p and q.

You are given a sequence of key values. Write a program that computesthe minimal number of exchange operations that are necessary to makethe sequence sorted.

PROGRAM NAME: sort3

INPUT FORMAT

Line 1:N (1 <= N <= 1000), the number ofrecords to be sorted
Lines 2-N+1:A single integer from the set {1, 2, 3}

SAMPLE INPUT (file sort3.in)

9
2
2
1
3
3
3
2
3
1

OUTPUT FORMAT

A single line containing the number of exchanges required

SAMPLE OUTPUT (file sort3.out)

4
一开始思路错误导致wa了几次。。

wa思路:类似冒泡排序,直接查找,对2正向找小于它的数,对3逆向找小于它的数。很明显这样子会导致一些应该和2交换的数变成了和3交换

AC思路:先统计出每个数字的数量划分三个区域,在三个区域中分别查找需要交换的数字。在区域1中同样要符合数字2要正向找,数字3逆向找

然后在区域2统计一下3的数量就行。

下面是代码:

/*
ID: shhyzzu
PROG: sort3
LANG: C++
*/
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#include<iomanip>
using namespace std;
int n;
int a[2000];
int num[5]={};
int ans=0;
void init()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        num[a[i]]++;
    }
}
void work()
{
    for(int i=1;i<=num[1];i++)
    {
        if(a[i]==2)
        {
            for(int j=num[1]+1;j<=n;j++)//正向查找1
            {
                if(a[j]==1)
                {
                    int t=a[i];
                    a[i]=a[j];
                    a[j]=t;
                    ans++;
                    break;
                }
            }
        }
        else if(a[i]==3)
        {
            for(int j=n;j>num[1];j--)//逆向查找1
            {
                if(a[j]==1)
                {
                    int t=a[i];
                    a[i]=a[j];
                    a[j]=t;
                    ans++;
                    break;
                }
            }
        }
    }
    for(int i=num[1]+1;i<=num[1]+num[2];i++)
    {
        if(a[i]==3)//统计区域2中3的数量
            ans++;
    }
    printf("%d\n",ans);
}
int main()
{
    freopen("sort3.in","r",stdin);
    freopen("sort3.out","w",stdout);
    init();
    work();
    return 0;
}


内容概要:本文档详细介绍了一个利用Matlab实现Transformer-Adaboost结合的时间序列预测项目实例。项目涵盖Transformer架构的时间序列特征提取与建模,Adaboost集成方法用于增强预测性能,以及详细的模型设计思路、训练、评估过程和最终的GUI可视化。整个项目强调数据预处理、窗口化操作、模型训练及其优化(包括正则化、早停等手段)、模型融合策略和技术部署,如GPU加速等,并展示了通过多个评估指标衡量预测效果。此外,还提出了未来的改进建议和发展方向,涵盖了多层次集成学习、智能决策支持、自动化超参数调整等多个方面。最后部分阐述了在金融预测、销售数据预测等领域中的广泛应用可能性。 适合人群:具有一定编程经验的研发人员,尤其对时间序列预测感兴趣的研究者和技术从业者。 使用场景及目标:该项目适用于需要进行高质量时间序列预测的企业或机构,比如金融机构、能源供应商和服务商、电子商务公司。目标包括但不限于金融市场的波动性预测、电力负荷预估和库存管理。该系统可以部署到各类平台,如Linux服务器集群或云计算环境,为用户提供实时准确的预测服务,并支持扩展以满足更高频率的数据吞吐量需求。 其他说明:此文档不仅包含了丰富的理论分析,还有大量实用的操作指南,从项目构思到具体的代码片段都有详细记录,使用户能够轻松复制并改进这一时间序列预测方案。文中提供的完整代码和详细的注释有助于加速学习进程,并激发更多创新想法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值