今天写了三道题目
给你两个字符串 $$$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';}
}