GYM 101604 || 20181010

本文分享了三道算法竞赛题目的解决方案,包括如何判断字符串是否可通过交换变为回文串,设计策略避免坐标系中的角色到达坐标轴,以及计算特定函数在n位数中的最大最小值。每道题目都附带了详细的解题思路和代码实现。

看着前面咕咕咕的国庆集训 难受

十月十日要萌一天哇www

 

A.字符串

题意:给定一个字符串 问能否交换两个字符或者不交换字符,使其成为回文串

之前写的太丑 重写一遍加一堆 if 竟然过了w

思路:求出正序和倒叙有多少个不同的,根据不同的数量以及字符串长度(奇偶)判断。。

体验就是这种题要想好了再下笔。。(*下键盘

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn = 500100;
char str[maxn];
int idx[3][2];
int main()
{
    scanf("%s", str);
    int len = strlen(str);
    int cnt = 0;
    for(int i = 0; i < (len>>1); i++)
    {
        if(cnt > 2) break;
        if(str[i] != str[len-1-i]) cnt++, idx[cnt-1][0] = str[i], idx[cnt-1][1] = str[len-1-i];
    }
    if(!cnt) printf("YES\n");
    else if(cnt > 2) printf("NO\n");
    else if(cnt == 1 && (len&1) && (idx[0][0]==str[len>>1] || idx[0][1]==str[len>>1])) printf("YES\n");
    else if(cnt == 1) printf("NO\n");
    else if((idx[0][0] == idx[1][1] && idx[0][1] == idx[1][0]) || (idx[0][0]==idx[1][0] && idx[0][1]==idx[1][1])) printf("YES\n");
    else printf("NO\n");//
    return 0;
}
View Code

 

B.贪心(?)

题意:坐标系中,起始位置(1, 1) ,有n张卡片,可以按不同顺序执行,卡片上写t, x, y, 分为两种,t == 1是向右走x步再向左走y步,  t == 2是向上走x步再向下走y步,到坐标轴就GG

思路:想一想可以发现(嗯我第一次就是因为没有想以为就是模拟wa了 zz难受)只要在横着和竖着移动的合能≥0,那么就可以有一种策略使它不能到坐标轴

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn = 500100;
int main()
{
    int n;
    scanf("%d", &n);
    int x = 1, y = 1;
    bool ok = true;
    for(int i = 0; i < n; i++)
    {
        int t, xi, yi;
        scanf("%d%d%d", &t, &xi, &yi);
        if(t==1){
            x += xi;
            x -= yi;
        }
        if(t==2){
            y += xi;
            y -= yi;
        }
    }
    if(x <= 0 || y <= 0) printf("NO\n");
    else printf("YES\n(%d, %d)\n", x, y);
    return 0;
}
View Code

 

好困 留坑orz

好困 填坑orz

 

C.数字思维

题意:f(x) = x - x的每一位数的平方,如f(45) = 45 - 4*4 - 5*5

求n位数中函数值最大和最小的数,和它们的函数值

思路:对于最小值,一位数减的最多的一定是9 - 81,十位以上的话一定是0,因为10-1>0, 20-4>0, 30-9>0……,所以格式就是1000009

对于最大值,一定要9开头,因为900-81>800-64……,然后呢,40-16=24, 50-25=25, 60-36=24, 所以两位数的话要50能得到最大值,所以格式是9999999950

输出一下就可以了

zz错误。。过长的时候先计算后12位减的结果,后12位应该是999999999950而不是12个9……

#include <stack>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
LL pow10(int x)
{
    LL ans = 1;
    for(int i = 0; i < x; i++)
        ans *= 10LL;
    return ans;
}
int main()
{
    int n;
    scanf("%d", &n);
    LL maxx, max_idx, minn, min_idx;
    if(n==1) {printf("1\n9\n0\n-72\n"); return 0;}
    if(n < 12)
    {
        max_idx = pow10(n)-50;
        min_idx = pow10(n-1) + 9;
        maxx = max_idx, minn = min_idx;
        for(int i = 0; i < n-2; i++) maxx -= 81;
        maxx -= 25;
        minn -= 82;
        printf("%lld\n%lld\n%lld\n%lld\n", max_idx, min_idx, maxx, minn);
        return 0;
    }
    for(int i = 0; i < n-2; i++) printf("9"); printf("50\n");
    printf("1"); for(int i = 0; i < n-2; i++) printf("0"); printf("9\n");
    LL tmp = 999999999950LL;//啊啊啊这里最后是50
    tmp = tmp - (LL)(81*(n-2)) - 25LL;
    for(int i = 12; i < n; i++) printf("9"); printf("%lld\n", tmp);
    for(int i = 0; i < n-3; i++) printf("9"); printf("27\n");
    return 0;
}
/*
9999950
1000009
(max_idx)
(min_idx)
*/
View Code

 

转载于:https://www.cnblogs.com/pinkglightning/p/9769868.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值