CodeForces 451B (翻转一次递减子序列得到递增序列) 简单题

递增序列翻转算法
本文介绍了一种算法,用于判断是否可以通过翻转数列中的递减子序列使其变为递增序列,并给出了具体的实现代码及一种更简洁的排序比较方法。

题目大意:判断能否找到递减的子列,将其翻转后得到的整个数列递增,只能找一次,最后输出,如果能还要输出翻转的首尾位

                    置,注意数数组下标,不是首尾的数,当然如果本来数列就递增,就随便找个数翻一下。

        我的方法是直接模拟,直接从a[0]开始寻找递减序列,然后判断递减序列翻转后能否构成递增序列。

#include<stdio.h>
int n,a[100005];
int main()
{
    int i,j,h;
      bool bo=true;
        scanf("%d",&n);
          for (i=0;i<n;i++)scanf("%d",&a[i]);
            i=0;
    while (a[i]<=a[i+1]&&i<n-1) i++;   //找到开始递减的数a[i],即左端点
      if (i==n-1)      //如果数列一直递增,就省事多了
        {
           bo=false;
           printf("yes\n1 1");
        }
           j=i;
    while (j<n-1&&a[j]>a[j+1]&&bo) j++;      //找到递减序列的右端点
           if (i>0&&a[j]<a[i-1]&&bo)         //看看能不能接上,就是递减子列翻转后的左端点不能小于前一个数
           {
               printf("no\n");
               bo=false;
           }
    if (j==n-1&&bo)                                //判断后面是否还有数
        {
            bo=false;
            printf("yes\n%d %d\n",i+1,j+1);
        }
           h=j;
           if (h<n-1&&a[h+1]<a[i]&&bo)        //看看能不能接上
           {
               printf("no\n");
               bo=false;
           }
    while (h<n-1&&bo)          //如果后面还有数有,看看能不能保证递增
    {
        if (a[h]>a[h+1])
        {
            bo=false;
            printf("no\n");
        }
        h++;
    }
    if (bo) printf("yes\n%d %d\n",i+1,j+1);         
    return 0;
}

         我的方法有点啰嗦,实际上还有方法,就是现将整个数列按由小到大排序后与原数列比较,

在原数列中分别从最左端、最右端开始找不相等的数,看看这段子列是否满足递减。

推荐使用先排序、后比较的方法。

### Codeforces 目列表获取方式 对于希望在Codeforces上寻找目进行练习的用户而言,可以通过访问Codeforces官方网站并导航至竞赛页面来浏览不同类型的目。具体来说,在网站主页上方菜单栏中选择“Problemset”,这里包含了大量历史比赛中的目供用户筛选[^1]。 为了更高效地找到适合自己的练习,可以利用页面右侧的一系列过滤条件,比如通过标签(Tags)、难度等级(Rating)或是特定的比赛名称来进行精准查找。例如,如果对组合数学感兴趣或者想要挑战与之相关的算法,“Combinatorics”就是一个不错的标签选项;而针对新手用户,则可以从较低评级开始尝试逐步提升难度。 另外值得注意的是,除了直接搜索之外,还可以关注官方举办的各类赛事公告以及社区内其他用户的推荐资源,这些都能帮助发现更多优质习。 ```python import requests from bs4 import BeautifulSoup def fetch_codeforces_problems(): url = 'https://codeforces.com/problemset' response = requests.get(url) soup = BeautifulSoup(response.text,'html.parser') problems_table = soup.find('table',{'class':'problems'}) rows = problems_table.findAll('tr')[1:] # 跳过表头 result = [] for row in rows: cols = row.findAll('td') problem_info = { "index": cols[0].text.strip(), "name": cols[1].a['title'], "link": f"https://codeforces.com{cols[1].a['href']}" } result.append(problem_info) return result[:5] # 返回前五个作为示例 fetch_codeforces_problems() ``` 此段Python代码展示了如何爬取Codeforces Problemset页面的部分数据,并将其整理成易于阅读的形式返回给调用者。当然实际应用时还需要考虑异常处理等问以确保程序稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值