A.
让所有的都到sum即可

#include<bits/stdc++.h>
using namespace std;
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int t;
    cin >> t;
    while(t--){
        int n;
        cin >> n;
        cout << n << endl;
        for(int i=1; i<=n; i++){
            cout << i << " ";
        } 
        cout <<'\n';
    }
}

B.
如果相邻的两个都是负号,那么可以抵消,如果负号相邻的是正数,那么负号可以转移,从而最后如果剩一个负号,那么转移给绝对值最小的那个即可。

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
int a[11][11];
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int t;
    cin >> t;
    while(t--){
        int n, m, s=0, cnt = 0;
        cin >> n >> m;
        int mi = INF;
        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                cin >> a[i][j];
                if(a[i][j] < 0) cnt++;
                s += abs(a[i][j]);
                mi = min(mi, abs(a[i][j]));
            }
        }
        if(cnt % 2) s-=2*mi;
        cout << s << endl;
    }
}

C.
对于一个小于等于w的物品,如果它大于等于(w+1)/2,那就直接输出这个即可,如果小于(w+1)/2,那么sum+=这个数,直到最后大于(w+1)/2即可。

#include<bits/stdc++.h>
using namespace std;
#define int long long
vector<int> ans;
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int t;
    cin >> t;
    while(t--){
        int n, w;
        cin >> n >> w;
        int p = 0, s = 0;
        for(int i=1, x; i<=n; i++){
            cin >> x;
            if(x <= w)
            {
                if(x >= (w+1)/2) p = i;
                else if(s < (w+1)/2) ans.push_back(i), s+=x;
            }
        }
        if(p)
            cout << 1 << endl << p;
        else if(s >= (w+1)/2){
            cout << ans.size()<<endl;
            for(auto x:ans) cout << x << ' ';
        }
        else cout << -1;
        cout << endl;
        ans.clear();
    }
}

D.
给定两个字符串,求其中的贡献值最大,贡献值最大为4LCS(a,b)-|a|-|b|,
思路:dp[i][j]表示a的前i个字符和b的前j个字符的最大贡献值。如果a[i]=b[j], 那么dp[i][j] = dp[i-1][j-1]+2,否则dp[i][j]=max(dp[i-1][j], dp[i][j-1])

#include<bits/stdc++.h>
using namespace std;
int dp[5010][5010];
int main()
{
    int n, m;
    string a, b;
    cin >> n >> m;
    cin >> a;
    cin >> b;
    int ans = 0;
    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++){
            if(a[i-1] == b[j-1]) dp[i][j] = dp[i-1][j-1]+2;
            else{
                dp[i][j] = max({0, dp[i-1][j]-1, dp[i][j-1]-1});
            }
            ans = max(ans, dp[i][j]);
        }
    }
    cout << ans << endl;
}

待更新