Sicily1001, 1306, 1438

本文解析了三个典型的算法问题:数字串的排列组合问题采用动态规划解决,排序问题使用了冒泡排序和归并排序两种方法,购物折扣问题通过贪心算法实现。每道题目都给出了详细的解题思路及代码实现。

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

1001 AlphaCode

http://soj.sysu.edu.cn/1001
- 题目:用[1,26]表示字母,给定一串数字,算出其代表的字母串有多少种排列组合
- 思路:动态规划
- 代码:

cin >> encry;
if (encry.compare("0") == 0)
   break;

memset(dp, 0, sizeof(dp));
dp[0] = 1;
int n = encry.length();
for (int i = 1; i < n; i++) {
   int joint = (encry[i-1] - '0') * 10 + encry[i] - '0';
   // 一定不能在一起
   if (encry[i-1] == '0' || encry[i-1] >= '3' || joint > 26) {
       dp[i] = dp[i-1];
   }
   // 必须在一起
   else if (encry[i] == '0'){
       if (i < 2) dp[i] = 1;
       else dp[i] = dp[i-2];
   }
   // 可在一起也可分开
   else {
       if (i < 2) dp[i] = 2;
       else dp[i] = dp[i-2] + dp[i-1];
   }
}
cout << dp[n-1] << endl;

1306 Sorting

http://soj.sysu.edu.cn/1306
- 题目:排序
- 思路:归并,冒泡
- 代码:

//冒泡
void BubbleSort(int arr[], int n)
{
    int min, index, temp;
    for (int i = 0; i < n; i++) {
        min = arr[i];
        index = i;
        for (int j = i+1; j < n; j++) {
            if (min > arr[j]) {
                min = arr[j];
                index = j;
            }
        }
        if (index != i) {
            temp = arr[i];
            arr[i] = arr[index];
            arr[index] = temp;
        }
    }
}
// 合并数组
void combine(int arr[], int beg, int mid, int end)
{
    int *tmp = (int*) malloc(sizeof(int) * (end - beg + 1));
    int p = beg, q = mid + 1, k = 0;
    while (p <= mid && q <= end) {
        if (arr[p] < arr[q]) {
            tmp[k++] = arr[p++];
        }
        else if (arr[p] > arr[q]) {
            tmp[k++] = arr[q++];
        }
        else {
            tmp[k++] = arr[p++];
            tmp[k++] = arr[q++];
        }
    }

    if (p <= mid) {
        for (int i = p; i <= mid; i++) {
            tmp[k++] = arr[i];
        }
    }
    if (q <= end) {
        for (int i = q; i <= end; i++) {
            tmp[k++] = arr[i];
        }
    }
    for (int i = beg; i <= end; i++) {
        arr[i] = tmp[i-beg];
    }
    free(tmp);
}
// 归并排序
void MergeSort(int arr[], int beg, int end)
{
    if (end > beg) {
        int mid = (end + beg) / 2;
        MergeSort(arr, beg, mid);
        MergeSort(arr, mid + 1, end);
        combine(arr, beg, mid, end);
    }
}

1438 Shopaholic

http://soj.sysu.edu.cn/1001
- 题目:商店买3免1,求最大折扣
- 思路:贪心
- 代码:

// 先排序
MergeSort(arr, 0, n-1);
int sum = 0;
// 贪心
for (int i = n-3; i >= 0; i -=3) {
   sum +=arr[i];
}
printf("%d\n", sum);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值