【星航计划】2024.11 Div. 3 题解
2024 -- 星航计划 --十一月份 -- 基础算法
每一段连续的
- 对于
个连续的 ,如果 是奇数,最优策略是将其划分为 个单独的 ,答案为 ; - 否则最优策略是将其划分为
个单独的 和两个连续的 ,答案为与 。
时间复杂度
#include <bits/stdc++.h>
#define int long long
using ll = long long;
using pll = std::pair<int, int>;
using namespace std;
signed main(){
cin.tie(nullptr)->sync_with_stdio(false);
string s;
cin >> s;
int n = s.size();
s = ' ' + s + '0';
vector<int> per(n + 3);
vector<int> k;
double ans = 0;
for (int i = 1; i <= n + 1; ++i){
if (s[i] == '1')
per[i] = per[i - 1] + 1;
else
if (per[i - 1])
k.push_back(per[i - 1]);
}
for (int i : k){
while (i > 2){
i -= 2;
ans += 1;
}
ans += sqrt(double(i));
}
cout << fixed << setprecision(13) << ans;
return 0;
}
矩形的边无凹凸,所以四角只能使用
#include <bits/stdc++.h>
using namespace std;
int T, a, b, c, d;
int main() {
cin >> T;
while (T--) {
cin >> a >> b >> c >> d;
if (a < 4) {
cout << 0 << endl;
continue;
}
if (b > c)
b = c;
int ans = 0;
for (int i = 0; i <= b; i++) {
int temp = INT_MAX;
if (i != 0)
temp = d / i;
int t = min(temp, b - i);
ans = max(ans, 4 + i * 2 + t * 2 + i * t);
}
cout << ans << endl;
}
return 0;
}
由于新插入的整数只能插入到相邻整数之间,因此新插入的整数不会对除这两个整数之外的其他整数产生影响,所以接下来我们对每两个相邻整数分别考虑考虑原序列中两相邻整数
对于
- 均为
- 均为
为 , 为 为 , 为
注意到对于满足第一种情况的位,不管怎么操作,得到的数都永远为
剩下的三种情况,每种其实都可以取到
加入 set
里去重即可。
#include <bits/stdc++.h>
using namespace std;
set<int> st;
int arr[100005];
int n;
int main() {
cin >> n,arr[0];
st.emplace(0);
for (int i = 1; i < n; i++) {
cin >> arr[i];
int a = arr[i - 1],b = arr[i];
st.emplace(a);
st.emplace(b);
st.emplace(a | b);
st.emplace(a & b);
st.emplace(a ^ b);
st.emplace((a ^ b) & a);
st.emplace((a ^ b) & b);
}
cout << st.size();
return 0;
}
只考虑任意相邻的两项什么时候满足
如果存在一位,既要求放
#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 7, M = 65;
int n, g[M][2];
long long k, f[N];
void solve()
{
scanf("%d", &n);
for (int i = 60; i >= 0; i--)
g[i][0] = g[i][1] = 1;
for (int i = 1; i <= n; i++)
scanf("%lld", &f[i]);
for (int i = 1; i < n; i++)
for (int j = 60; j >= 0; j--)
if (((f[i] >> j) & 1) != ((f[i + 1] >> j) & 1))
{
if ((f[i] >> j) & 1)
g[j][0] = 0;
else
g[j][1] = 0;
break;
}
long long ans = 1, sum = 0;
for (int i = 60; i >= 0; i--)
{
// cout<<g[i][0]<<g[i][1]<<endl;
if (!g[i][0] && !g[i][1])
{
sum = -1;
break;
}
if (!g[i][0])
sum |= (1ll << i);
}
cout << sum << '\n';
}
int main()
{
int T;
cin >> T;
while (T--)
solve();
return 0;
}
分类:
梦熊星航计划题解合集
标签:
题解
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!