20230820-取余-枚举最大的删除位置-01字符串下标奇偶性与字符奇偶性-动态规划-C++实现

题目见链接:https://mp.weixin.qq.com/s/CChKz8UOgjmaXZbaYsnbww

小美的外卖订单编号

#include 
using namespace std;
// 如果可以整除,那么直接输出m。否则则是x%m。
int main()
{
    int T, m, x;
    scanf("%d", &T);
    while (T--)
    {
        scanf("%d %d", &m, &x);
        // 就是一个简单的求模值
        printf("%d\n", (x - 1) % m + 1);
    }
}

小美的加法

#include 
using namespace std;
typedef long long ll;

// 这样是为了节省时间
const int N = 100004;
ll a[N];
// 枚举最大的删除位置
int main()
{
    int n;
    scanf("%d", &n);
    ll s = 0;
    for (int i = 1; i <= n; i++)
    {
        scanf("%lld", &a[i]);
        s += a[i];
    }
    ll ans = s; // s此时为所有元素的和
    for (int i = 1; i < n; i++)
    {
        // 找到最大的值
        ans = max(ans, s - a[i] - a[i + 1] + a[i] * a[i + 1]);
    }
    printf("%lld\n", ans);
}

小美的01串翻转

#include 
using namespace std;
typedef long long ll;

const int N = 100004;
char s[N];
int main()
{
    scanf("%s", s + 1);
    int n = strlen(s + 1);
    int ans = 0;
    for (int i = 1; i <= n; i++)
    {
        int cnt = 0;
        for (int j = i; j <= n; j++)
        {
            // 奇数就是最后一位为1,偶数就是最后一位为0
            // 1的ASCII码是49,对应于奇数
            // 01字符串中,相邻两位都不相同的情况就是 10101010... 或者0101010101...
            // 所以字符串的下标奇偶性和字符的奇偶性要么都相同,要么都不相同
            // 假设字符串s有c个下标的奇偶性都和字符的奇偶性相同,那么s的权值为min{c, n - c},因为要取最小的方法
            cnt += ((s[j] & 1) == ((j - i) & 1));
            ans += min(cnt, j - i + 1 - cnt);
        }
    }
    printf("%d\n", ans);
}

小美的数组构造

#include 
using namespace std;
typedef long long ll;

// 这是一个动态规划的题目
// dp[i][j]表示 长度为i,和为j的数组b,且满足所有b[i] != a[i],有多少种
// dp[i][j]的初始化为dp[0][0] = 1
// dp[i][j] = sum(dp[i - 1][j - k]), 1 <= k <= j, k != a[i]
const int N = 504;
int mod = 1e9 + 7;
int n, s = 0;
int main()
{
    scanf("%d", &n);
    cout << n << endl;
    // 定义dp
    int dp[n + 1][N] = {0};
    int a[n + 1];
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &a[i]);
        s += a[i];
    }
    // 初始化dp
    dp[0][0] = 1;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= s; j++)
        {
            for (int k = 1; k <= j; k++)
            {
                if (a[i] != k)
                {
                    // 更新dp
                    dp[i][j] = (dp[i][j] + dp[i - 1][j - k]) % mod;
                }
            }
        }
    }
    printf("%d\n", dp[n][s]);
}

解析见链接:https://ujimatsu-chiya.github.io/EXAM/Meituan-20230819/

你可能感兴趣的:(Algorithms,动态规划,算法)