A 字符串的构建
给你一个字符串是否能够由:aa、aaa、bb、bbb构成。
解题思路:对比相邻两位是否一样,如果到最后两个及以上不一样了 就构不成了。
string s;
cin >> s;
int len = s.length();
bool flag = false;
int cnt = 1;
for (int i = 0; i < len; i++)
{
if (s[i] == s[i + 1])
cnt += 1;
else
{
if (cnt > 1)
{
cnt = 1;
}
else
{
cnt = 0;
break;
}
}
}
cout << ((cnt == 0) ? "NO" : "YES") << endl;
收获:无,毕竟是水题。
B. 连续积分段
题目大意:坐标轴上有n个点 ,每个点都可以向左或向右调整一位,问是否能调整成一个连续的区间。
解题思路:若能构成连续的区间,总数上肯定是满足首位减去末尾小于等于n-1。
cin >> n;
rep(i,1,n)
cin >> a[i];
if(a[n]-a[1]<=n+1)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
收获:若是我平时可能会直接暴力写了,有时候做连续区间问题的时候,可以在首末位上找一些数学关系。
C. 甜蜜生活
题目大意:n个商店卖糖,每天只卖一包。 你每天都有x元去买糖,每天可以买多个店的。问最多买几包。
解题思路:没什么特殊技巧 贪心思想罢了。
cin >> n >> x;
rep(i, 0, n - 1)
cin >>a[i];
sort(a, a + n);
b[0] = a[0];
for (int i = 1; i < n; i++)
{
b[i] = b[i - 1] + a[i];
}
int temp, ans = 0;
for (int i = 0; i < n; i++)
{
temp = x - b[i] + i + 1;
c[i] = temp / (i + 1);
if (c[i] <= 0)
{
c[i] = 0;
}
ans += c[i];
}
cout << ans << endl;
收获:练习了贪心但收获不大。
D. 插入进度
题意:
给定一个数组 ,现在你需要往里面插入1~x 。使得相邻两项之差的绝对值之和最小。
即最小化:
∑
i
=
0
n
\sum_{i=0}^n
∑i=0n
∣
\mid
∣ a[i] - a[i-1]
∣
\mid
∣
解题思路:
发现插入x的值若是在a[i]⩽a[i-1]之间 对最后结果没有起到任何的作用。
后面贴图的没有想出来 引用严格鸽的思路讲解。记录一下这一道题确实让我学习到了相关知识。
int fun(int x) {
int res = min(abs(a[1] - x), abs(a[n] - x));
for (int i = 2; i <= n; i++) {
res = min(res, abs(a[i] - x) + abs(a[i - 1] - x) - abs(a[i] - a[i - 1]));
}
return res;
}
void slove() {
cin >> n; int x; cin >> x;
for (int i = 1; i <= n; i++)cin >> a[i];
int ans = 0;
for (int i = 2; i <= n; i++)ans += abs(a[i] - a[i - 1]);
ans += fun(1);
if (*max_element(a + 1, a + 1 + n) < x)ans += fun(x);
cout << ans << endl;
}
总结:这一场是关于贪心、数学的数轴插入场。D题做下来还是很大收获的,等我实力再好点就把E给补了。另外要感谢严格鸽每场的讲解让我收获颇丰。