九度OJ 1417-1430(4/14)

本文提供了几个具体的算法解决方案,包括并查集实现、字符串排序及背包问题等,通过C语言实现,帮助读者理解算法原理及其应用。

1417

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define N 100
#define M 10000
#define LEN 101

typedef struct node {
    int x;
    int y;
    int d;
} ROAD;

int n;
int pre[N+1];
int count[N+1];
int num;

void init()
{
    for (int i=1; i<=n; i++)
    {
        pre[i] = i;
        count[i] = 1;
    }
    num = n;
}

int find(int i)
{
    while (i != pre[i])
        i = pre[i];
    return i;
}

int combine(int i, int j)
{
    int a = find(i);
    int b = find(j);
    if (a != b)
    {
        if (count[a] > count[b])
        {
            pre[b] = a;
            count[a] += count[b];
            count[b] = 0;
        }
        else
        {
            pre[a] = b;
            count[b] += count[a];
            count[a] = 0;
        }
        num --;
        return 1;
    }
    else
        return 0;
}

int cmp(const void *a, const void *b)
{
    ROAD *x = (ROAD *)a;
    ROAD *y = (ROAD *)b;
    return x->d - y->d;
}

char mods[N][LEN];
int countMods;

int insert(char s[LEN])
{
    int i;
    for (i=0; i<countMods; i++)
    {
        if (strcmp(s, mods[i]) == 0)
            break;
    }
    if (i == countMods)
    {
        strcpy(mods[countMods++], s);
        return countMods;
    }
    return i+1;
}           

int main(void)
{       
    int m, i;
    ROAD r[M];
    char sa[LEN], sb[LEN];
    int max;

    while (scanf("%d%d", &n, &m) != EOF)
    {   
        countMods = 0;
        for (i=0; i<m; i++)
        {
            scanf("%s%s%d", sa, sb, &r[i].d);
            r[i].x = insert(sa);
            r[i].y = insert(sb);
        }
        qsort(r, m, sizeof(r[0]), cmp);
        //for (i=0; i<m; i++)
        //    printf("%d %d %d\n", r[i].x, r[i].y, r[i].d);

        init();
        max = 0;
        for(i=0; i<m; i++)
        {   
            if(combine(r[i].x, r[i].y))
                max = r[i].d;
            if (num == 1)
                break;
        }

        if (num > 1)
            printf("My God\n");
        else
            printf("%d\n", max);
    }

    return 0;
}   
/**************************************************************
    Problem: 1417
    User: liangrx06
    Language: C
    Result: Accepted
    Time:100 ms
    Memory:976 kb
****************************************************************/

1418(未完成)


1419

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

#define M 200

struct doc {
    char s[M+1];
    char slower[M+1];
};

int cmp(const void *a, const void *b)
{
    struct doc *c = (struct doc *)a;
    struct doc *d = (struct doc *)b;
    return strcmp(c->slower, d->slower);
}

int main()
{
    int i, j, n;
    struct doc d[M];
    while(scanf("%d\n", &n) != EOF)
    {
        for (i=0; i<n; i++)
        {
            gets(d[i].s);
            for (j=0; d[i].s[j]; j++)
                d[i].slower[j] = tolower(d[i].s[j]);
            d[i].slower[j] = '\0';
        }
        qsort(d, n, sizeof(d[0]), cmp);
        for (i=0; i<n; i++)
            printf("%s\n", d[i].s);
    }
    return 0;
}

/**************************************************************
    Problem: 1419
    User: liangrx06
    Language: C
    Result: Accepted
    Time:50 ms
    Memory:932 kb
****************************************************************/

1420

#include <stdio.h>
#include <string.h>

int n, k;
int fruit[100], used[100]; 
int total, half;

void dfs(int x, int y) 
{
    int i;
    if (y > half) 
        return;
    if (y > k) 
        k = y;
    if (k == half) 
        return;
    for (i = x; i < n; i++)
    {
        if (!used[i]) {
            used[i] = 1;
            dfs(i + 1, y + fruit[i]);
            used[i] = 0;
        }                       
    }
}                                               

int main() {                                                
    int i;                                                          
    while(scanf("%d", &n) != EOF) 
    {
        total = 0;                                                                  
        for(i = 0;i < n; i++) 
        {
            scanf("%d", &fruit[i]);                                                    
            total += fruit[i];
        }                                                                              
        k = -1;
        half = total >> 1;                                                             
        memset(used, 0, sizeof(used));
        dfs(0, 0);                                                                     
        printf("%d\n", total- k * 2);
    }                                                                                  
    return 0;
}
/**************************************************************
    Problem: 1420
    User: liangrx06
    Language: C
    Result: Accepted
    Time:50 ms
    Memory:916 kb
****************************************************************/

1421(未完成)


1422

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

#define N 1000000
#define INF INT_MAX

int a[N+2], left[N+2], li[N+2], right[N+2], ri[N+2];

int main(void)
{
    int t, n, i, j;

    scanf("%d", &t);
    while (t--)
    {
        scanf("%d", &n);
        for(i=1; i<=n; i++)
            scanf("%d", &a[i]);
        left[0] = a[0] = INF;
        li[0] = 0;
        right[n+1] = a[n+1] = INF;
        ri[n+1] = n+1;

        for (i=1; i<=n; i++)
        {
            if (a[i-1] < a[i])
            {
                left[i] = a[i-1];
                li[i] = i-1;
            }
            else if (left[i-1] < a[i])
            {
                left[i] = left[i-1];
                li[i] = li[i-1];
            }
            else
            {
                left[i] = INF;
                li[i] = 0;
                for (j=li[i-1]-1; j>=1; j--)
                {
                    if (a[j] < a[i])
                    {
                        left[i] = a[j];
                        li[i] = j;
                        break;
                    }
                }
            }
        }
        for (i=n; i>=1; i--)
        {
            if (a[i+1] < a[i])
            {
                right[i] = a[i+1];
                ri[i] = i+1;
            }
            else if (right[i+1] < a[i])
            {
                right[i] = right[i+1];
                ri[i] = ri[i+1];
            }
            else
            {
                right[i] = INF;
                ri[i] = n+1;
                for (j=ri[i+1]+1; j<=n; j++)
                {
                    if (a[j] < a[i])
                    {
                        right[i] = a[j];
                        ri[i] = j;
                        break;
                    }
                }
            }
        }
        /*
        for (i=1; i<=n; i++)
            printf("%d ", left[i]);
        printf("\n");
        for (i=1; i<=n; i++)
            printf("%d ", right[i]);
        printf("\n");
        */
        for (i=1; i<=n; i++)
        {
            if (i > 1)
                printf(" ");
            if (left[i] == INF && right[i] == INF)
                printf("%d", 0);
            else if (right[i] == INF)
                printf("%d", left[i]);
            else if (left[i] == INF)
                printf("%d", right[i]);
            else if (i - li[i] <= ri[i] - i)
                printf("%d", left[i]);
            else
                printf("%d", right[i]);
        }
        printf("\n");
    }

    return 0;
}
/**************************************************************
    Problem: 1422
    User: liangrx06
    Language: C
    Result: Accepted
    Time:1270 ms
    Memory:20444 kb
****************************************************************/

1423-1430(未完成)

内容概要:本文系统介绍了算术优化算法(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、付费专栏及课程。

余额充值