CodeForces599C【贪心】

本文介绍了一种基于块的排序算法实现思路,通过将序列划分为多个块并进行块内排序来求解最大可分块数量的问题。文章详细解释了如何通过离散化处理重复元素,并利用贪心策略确定最优分块方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:
给你一个序列,要求你从小到大排序,你可以划分成一个块一个块地进行块内排序,问你最多能分成几个块
思路:
贪心,首先感觉就是有正序的话我就分开啊;
难道倒序不能分块?321肯定不行啊。
存不存在连续两个倒序,但是后面有元素比前面块小,存在:[6 3] [5 1]
这样分成两块是错的。
所以首先是1,然后是2,然后是3,你可以标记啊,这个块有那么多元素,就是一段区间
比如第一个块,有n个元素的话,那么一定是[1,n],然后就是模拟。
然后他的数组元素不是1-n范围的,那么先离散化一下。

注意:重复元素在离散化时,要按照坐标小优先;

#include<bits/stdc++.h>
using namespace std;

const int N=1e5+10;
int n;
int a[N],dp[N];

struct asd{
    int val;
    int id;
};
asd q[N];

bool cmp(asd x,asd y){
    if(x.val==y.val)
        return x.id<y.id;
    return x.val<y.val;
}

void init (){
    sort(q+1,q+n+1,cmp);
    for(int i=1;i<=n;i++)
        dp[q[i].id]=i;
//    for(int i=1;i<=n;i++)
//        printf("%d ",dp[i]);
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        q[i].id=i;
        q[i].val=a[i];
    }
    init();
    int ans=0;
    int flag=0;
    int temp=0;
    for(int i=1;i<=n;i++)
    {
        if(flag<dp[i])
        {
            flag=dp[i];
            temp++;
        }
        else
            temp++;
        if(flag==temp)
            ans++;
    }
    printf("%d\n",ans);
    return 0;
}


### Codeforces Problem 1400C 解决方案 对于编号为1400C的编程题,在解决过程中可以采用贪心算法来处理字符串匹配问题。该方法的核心在于通过遍历输入字符串并维护两个指针分别指向模式串的不同位置,以此实现高效匹配[^1]。 具体来说: - 初始化两个变量 `i` 和 `j` 分别用于追踪主串和模式串的位置。 - 遍历整个主串的同时尝试找到尽可能多的有效字符组合使得其能够按照给定条件形成目标子序列。 - 如果当前字符满足特定规则,则移动模式串对应的索引;否则继续检查下一个可能的位置直到完成全部扫描工作为止。 ```cpp #include <bits/stdc++.h> using namespace std; bool canFormSubsequence(const string& mainStr, const string& pattern) { int i = 0; // Index for mainStr int j = 0; // Index for pattern while (i < mainStr.size() && j < pattern.size()) { if ((mainStr[i] - 'a' + 1) % 2 == (pattern[j] - 'a' + 1)) { // Check condition based on problem statement ++j; } ++i; } return j == pattern.size(); } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t; cin >> t; while(t--) { string s, p; cin >> s >> p; cout << (canFormSubsequence(s, p) ? "YES\n" : "NO\n"); } return 0; } ``` 此代码实现了上述逻辑,并针对多个测试案例进行了优化以提高执行效率。值得注意的是,这里假设输入数据已经过适当预处理,因此可以直接读取而无需额外验证或清理操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值