Educational Codeforces Round 93 (Rated for Div. 2)
Educational Codeforces Round 93 (Rated for Div. 2)
A. Bad Triangle
input
3
7
4 6 11 11 15 18 20
4
10 10 10 11
3
1 1 1000000000
output
2 3 6
-1
1 2 3
Note
In the first test case it is impossible with sides
In the second test case you always can construct a non-degenerate triangle.
题意:
在非递减序列中找坏三角形。
思路:
由于是非递减的序列,直接特判
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5;
ll a[maxn];
bool check(ll x, ll y, ll z) {
if (x + y <= z || x + z <= y || y + z <= x)
return false;
return true;
}
void solve() {
int n; cin >> n;
bool flag = false;
for (int i = 1; i <= n; ++i)cin >> a[i];
if (!check(a[1], a[2], a[n])) {
cout << 1 << " " << 2 << " " << n << endl;
}
else if (!check(a[1], a[n - 1], a[n]))
cout << 1 << " " << n - 1 << " " << n << endl;
else cout << "-1" << endl;
}
int main() {
//freopen("in.txt", "r", stdin);
int t; cin >> t;
while (t--)solve();
}
B. Substring Removal Game
题意:
Alice 和 Bob 又在玩游戏了,给出一个0,1构成的字符串,问在每个人都想得到最多分的情况下,Alice能得多少分(删去1的个数 = 所得分数)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5;
ll a[maxn];
bool check(ll x, ll y, ll z) {
if (x + y <= z || x + z <= y || y + z <= x)
return false;
return true;
}
void solve() {
string s;cin >> s;
vector<int>q;
int cnt = 0;
for (int i = 0; i < s.length(); ++i) {
if (s[i] == '1')cnt++;
else {
if (cnt == 0)continue;
q.push_back(cnt);
cnt = 0;
}
}
q.push_back(cnt);
cnt = 0;
sort(q.begin(), q.end());
for (int i = q.size() - 1; i >= 0; i -= 2)
cnt += q[i];
cout << cnt << endl;
}
int main() {
//freopen("in.txt", "r", stdin);
int t; cin >> t;
while (t--)solve();
}
C. Good Subarrays
题意:
给定一个
#include<bits/stdc++.h>
using namespace std;int T,n;
string s;map<int,int>mp;
int main(){
cin>>T;
while(T--){mp.clear();
cin>>n>>s;mp[0]++;
long long ans=0,sum=0;
for(int i=0;i<n;i++){
sum+=s[i]-'1';
ans+=mp[sum];mp[sum]++;
}
cout<<ans<<endl;
}
}
D. Colored Rectangles
Examples
input
1 1 1
3
5
4
output
20
input
2 1 3
9 5
1
2 8 5
output
99
input
10 1 1
11 7 20 15 19 14 2 4 13 14
8
11
output
372
题目大意:给定若干个红色,绿色,蓝色的一对长度一样的棍子.问用这些棍子组成的颜色不同的矩形的面积的最大总和是多少.注意不能把两个相同颜色的一对棍子拆成两个分别去用.其次颜色不同指的是在两个集合里选的两对棍子.
数据范围:
思路
首先比较容易想到的是贪心,但是这个题会跟棍子的数目有关,贪心会有很多问题,而且打补丁的方式是解决不了的.
考虑O(n3)O(n3)的DP,由于一共就三种元素,不妨就直接按定义直接设计状态:
状态:
入口:全为0即可,不需要额外处理.
转移:三种匹配方式直接枚举即可.
出口:所有值的最大值.
注意点的话,防止int爆掉吧
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int ll
const int N = 205;
int r[N],g[N],b[N];
int f[N][N][N];
signed main()
{
ios::sync_with_stdio(0);cin.tie(0);
int R,G,B;cin >> R >> G >> B;
for(int i = 1;i <= R;++i) cin >> r[i];sort(r + 1,r + R + 1,greater<int>());
for(int i = 1;i <= G;++i) cin >> g[i];sort(g + 1,g + G + 1,greater<int>());
for(int i = 1;i <= B;++i) cin >> b[i];sort(b + 1,b + B + 1,greater<int>());
int res = 0;
for(int i = 0;i <= R;++i)
{
for(int j = 0;j <= G;++j)
{
for(int k = 0;k <= B;++k)
{
auto& v = f[i][j][k];
if(i >= 1 && j >= 1) v = max(v,f[i - 1][j - 1][k] + r[i] * g[j]);
if(j >= 1 && k >= 1) v = max(v,f[i][j - 1][k - 1] + g[j] * b[k]);
if(i >= 1 && k >= 1) v = max(v,f[i - 1][j][k - 1] + r[i] * b[k]);
res = max(res,v);
}
}
}
cout << res << endl;
return 0;
}
E. Two Types of Spells
Example
input
6
1 5
0 10
1 -5
0 5
1 11
0 -10
output
5
25
10
15
36
21
分类:
刷题笔记: CF
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 全程不用写代码,我用AI程序员写了一个飞机大战