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;
}待更新

京公网安备 11010502036488号