今天写了三道题目
给你两个字符串 $$$a$$$ 和 $$$b$$$ ,这两个字符串都由小写拉丁字母组成。
字符串的子串是从原始字符串中删除几个(可能是零)字符后得到的字符串。字符串的子串是该字符串的连续子串。
例如,考虑字符串 abac:
- a、b、c、ab、aa、ac、ba、bc、aba、abc、aac、bac 和 abac 是其子序列;
- a、b、c、ab、ba、ac、aba、bac 和 abac 是它的子串。
你的任务是计算包含 $$$a$$$ 作为子串和 $$$b$$$ 作为子序列的字符串的最小可能长度。
第一思路是子序列在原串中每个字母必然是连续的,可以子串的每个字母若存在于子序列中则是离散的,所以遍历子串每个字母,再在子序列中找到离散的子串元素并记录数量,取遍历后的最大的最大元素个数和,再将a和b相加再减去遍历后的最大的最大元素个数和即为答案
#include<bits/stdc++.h>
#define ll long long
#define max_int 2147483647
#define max_ll 9223372036854775807
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int all;
cin>>all;
while(all--){
string a,b;
int longth=0;
cin>>a>>b;
for(int i=0;i<b.size();++i){
int s=i;
for(int p=0;p<a.size();++p){
if(a[p]==b[s]){
s++;
}
}
longth=max(longth,s-i);
}
cout<<a.size()+b.size()-longth<<endl;
}
}
某电影公司发行了 $$$2$$$ 部电影。有 $$$n$$$ 人观看了这些 $$$2$$$ 部电影。我们知道每个人对第一部电影的态度(喜欢、中立或不喜欢)以及对第二部电影的态度。
如果要求某人对电影留下评论,那么
- 如果这个人喜欢这部电影,他就会留下正面评论,这部电影的评分就会增加 $$$1$$$ ;
- 如果此人不喜欢这部电影,则会留下负面评论,电影评分将降低 $$$1$$$ ;
- 否则,他们会留下中性评论,电影评分不会改变。
每个人都会评论一部电影,您可以为每个人选择评论哪部电影。
公司的评分是两部电影评分的最小值。您的任务是计算公司可能获得的最高评分。
易得只有3*3种可能,则每次选择两值中的最大值操作会达到全局最优,不过当两值相同时情况不一样,均为0时不操作,为1或-1时则记录加了多少减了多少,在遍历完成后再判断怎么分配加减事较小值最大
#include <bits/stdc++.h>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
vector<int> a(n), b(n);
for (auto& x : a) cin >> x;
for (auto& x : b) cin >> x;
int x = 0, y = 0, neg = 0, pos = 0;
for (int i = 0; i < n; ++i) {
if (a[i] > b[i]) {
x += a[i];
} else if (a[i] < b[i]) {
y += b[i];
} else {
neg += (a[i] < 0);
pos += (a[i] > 0);
}
}
int ans = -1e9;
for (int i = -neg; i <= pos; ++i)
ans = max(ans, min(x + i, y + (pos - neg - i)));
cout << ans << '\n';
}
}