每日一题(6)

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string s1, s2;
    getline(cin, s1);
    getline(cin, s2);
    int i = s1.size();
    int j = 0;
    for (j = 0; j < i; j++)
    {
        if (s2.find(s1[j]) == -1)
            //找到返回该元素,没有找到返回-1
            cout << s1[j];
    }
    cout<<endl;
    return 0;
}

#include <iostream>

using namespace std;

int main()
{
    int n, sum;
    cin >> n >> sum;
    int* a = new int[n + 1];
    a[0] = 0;
    for (int i = 1; i <= n; i++)
        cin >> a[i];

    long **dp = new long *[n + 1];
    for (int i = 0; i < n + 1; i++)
        dp[i] = new long[sum + 1];

    for (int i = 0; i <= n; i++)
    for (int j = 0; j <= sum; j++)
        dp[i][j] = 0;

    for (int j = 0; j <= sum; j++)
        dp[0][j] = 0;
    for (int i = 0; i <= n; i++)
        dp[i][0] = 1;

    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= sum; j++)
        {
            if (j >= a[i])
                dp[i][j] = dp[i - 1][j] + dp[i - 1][j - a[i]];
            else
                dp[i][j] = dp[i - 1][j];
        }
    }

    cout << dp[n][sum] << endl;

    for (int i = 0; i <= n; i++)
        delete[]dp[i];
    delete[]dp;

    return 0;
}

设f(x)=4x+3,g(x)=8x+7。

计算可以得到以下两个规律:

(1) g(f(x))=f(g(x)) 即f和g的执行顺序没有影响。

(2) f(f(f(x)))=g(g(x)) 即做3次f变换等价于做2次g变换

由于规律(1) 对于一个可行方案,我们可以调整其变换的顺序。如ffggfggff,我们可以转化成 fffffgggg。

由于规律(2),并且为了使执行次数最少,每3个f我们可以转化成2个g,如方案fffffgggg,可以转化成ffgggggg。

因此一个最优的策略,f的执行次数只能为0,1,2。对于输入的x,我们只需要求x,4x+3,4(4x+3)+3的最小g执行次数就可以了。

猜你喜欢

转载自blog.csdn.net/sifanchao/article/details/81415891