Educational Codeforces Round 160 (Rated for Div. 2) 题解A~D
Educational Codeforces Round 160 (Rated for Div. 2)
A. Rating Increase
纯暴力,分割字符串,如果n1<n2就输出,如果遍历完整个数组都不存在n1<n2就输出-1.
const int N = 2e5 + 10;
int toint(string s)
{
stringstream ss;
ss << s;
int v;
ss >> v;
return v;
}
void solve()
{
string s;
cin >> s;
for (int i = 0; i < s.size(); i++)
{
if ((i<s.size()-1 && s[i+1] != '0') || i==s.size()-1)
{
int n1 = toint(s.substr(0, i+1));
int n2 = toint(s.substr(i + 1));
if (n1 < n2)
{
cout << n1 << " " << n2 << endl;
return;
}
}
}
cout << "-1" << endl;
}
B. Swap and Delete
贪心题目,可以先遍历整个字符串,统计0和1的个数,然后再次遍历整个字符串,碰到1就用0填,0就用1填,直到0和1中有一个消耗完,则说明此后所有的字符都应该删掉,答案即为n-i
const int N = 2e5 + 10;
void solve()
{
string s;
cin >> s;
int n1 = 0, n2 = 0;
for(int i=0;i<s.size();i++)
{
if(s[i]=='0') n1++;
else n2++;
}
for(int i=0;i<s.size();i++)
{
if(s[i]=='1') n1--;
else n2--;
if(n1 <0 || n2<0)
{
cout << s.size() - i<<endl;
return;
}
}
cout << 0 << endl;
}
C. Game with Multiset
首先用一个数组存入所有的2的i次方的个数,例如w[2]表示2的2次方的个数,然后每次要验证一个数是否可以由现有的数构成时,先拷贝一份w,然后从低位向高位二进制枚举要合成的数a的每一位(因为低位可以合成高位,但是高位无法分解成低位),如果a的i位为1且w[i]>=1,则将w[i]--(用于合成),并且将w[i]除以二加到他的高一位上去,若w[i]==0,则说明无法合成,输出-1,如果遍历完w数组,则说明可以合成,返回true
int w[32];
void solve()
{
int op,a;
cin >> op >> a;
if(op==1)
{
w[a]++;
}
else
{
int bak[32];
memcpy(bak,w,sizeof w);
for(int i=0;i<31;i++)
{
if(a&1)
{
if(bak[i])
{
bak[i]--;
}
else
{
puts("NO");
return;
}
}
a >>= 1;
if(i<30)
bak[i+1] += bak[i]/2;
}
puts("YES");
}
}
D. Array Collapse
dp,题解看注释
#define int long long
const int N = 3e5 + 10, MOD = 998244353;
//dp(i,0/1)表示是否选择第i个数,last_min(i)表示1~i-1中最接近nums[i]的小于nums[i]的数的下标,sum[i]表示前i个数中可达数组的sum
int dp[N][2], last_min[N], sum[N];
int nums[N];
int n;
void solve()
{
cin >> n;
for (int i = 1; i <= n; i++) //初始化
{
cin >> nums[i];
last_min[i] = 0;
sum[i] = 0;
dp[i][0] = dp[i][1] = 0;
}
stack<int> stk; //单调栈,用于处理last_min
for (int i = 1; i <= n; i++)
{
while (stk.size() && nums[stk.top()] > nums[i]) //如果栈顶大于nums[i]则全部pop
stk.pop();
if (stk.size()) //如果栈顶存在小于nums[i]的数,那么他一定是最接近nums[i]的数
last_min[i] = stk.top();
stk.push(i); //入栈
}
dp[0][0] = 1;
sum[0] = 1;
for (int i = 1; i <= n; i++)
{
if (last_min[i]) //如果存在比nums[i]小的数
{
//如果要选nums[i],那么应该减去包含last_min[i]的部分(因为如果存在last_min[i],肯定不存在nums[i],
//因为last_min[i]一定比nums[i]小,这会导致nums[i]一定会被删掉)
//同时如果不包含last_min[i]了,还应该加上不选last_min[i]的数量,也就是dp[last_min[i]][0]
dp[i][1] = (sum[i - 1] - sum[last_min[i] - 1] + dp[last_min[i]][0] + MOD) % MOD;
//如果不选nums[i],则说明肯定选了last_min[i]或者更小的部分,因此直接加上last_min的全部情况即可
dp[i][0] = (dp[last_min[i]][1] + dp[last_min[i]][0]) % MOD;
}
else //如果不存在比nums[i]小的数,则说明nums[i]一定可以选上,而且相当于方案数就是sum[i-1]
{
dp[i][1] = sum[i - 1];
}
//累加方案总数
sum[i] = (sum[i - 1] + dp[i][1]) % MOD;
}
cout << (dp[n][0] + dp[n][1]) % MOD << endl;
}
Educational Codeforces Round 160 (Rated for Div. 2) 题解A~D的更多相关文章
- Educational Codeforces Round 63 (Rated for Div. 2) 题解
Educational Codeforces Round 63 (Rated for Div. 2)题解 题目链接 A. Reverse a Substring 给出一个字符串,现在可以对这个字符串进 ...
- Educational Codeforces Round 65 (Rated for Div. 2)题解
Educational Codeforces Round 65 (Rated for Div. 2)题解 题目链接 A. Telephone Number 水题,代码如下: Code #include ...
- Educational Codeforces Round 64 (Rated for Div. 2)题解
Educational Codeforces Round 64 (Rated for Div. 2)题解 题目链接 A. Inscribed Figures 水题,但是坑了很多人.需要注意以下就是正方 ...
- Educational Codeforces Round 60 (Rated for Div. 2) 题解
Educational Codeforces Round 60 (Rated for Div. 2) 题目链接:https://codeforces.com/contest/1117 A. Best ...
- Educational Codeforces Round 58 (Rated for Div. 2) 题解
Educational Codeforces Round 58 (Rated for Div. 2) 题目总链接:https://codeforces.com/contest/1101 A. Min ...
- Educational Codeforces Round 47 (Rated for Div. 2) 题解
题目链接:http://codeforces.com/contest/1009 A. Game Shopping 题目: 题意:有n件物品,你又m个钱包,每件物品的价格为ai,每个钱包里的前为bi.你 ...
- Educational Codeforces Round 93 (Rated for Div. 2)题解
A. Bad Triangle 题目:https://codeforces.com/contest/1398/problem/A 题解:一道计算几何题,只要观察数组的第1,2,n个,判断他们能否构成三 ...
- Educational Codeforces Round 33 (Rated for Div. 2) 题解
A.每个状态只有一种后续转移,判断每次转移是否都合法即可. #include <iostream> #include <cstdio> using namespace std; ...
- Educational Codeforces Round 78 (Rated for Div. 2) 题解
Shuffle Hashing A and B Berry Jam Segment Tree Tests for problem D Cards Shuffle Hashing \[ Time Lim ...
- Educational Codeforces Round 81 (Rated for Div. 2) 题解
过了n天补的题解:D AB就不用说了 C. Obtain The String 思路挺简单的,就是贪心,但是直接贪心的复杂度是O(|s|*|t|),会超时,所以需要用到序列自动机 虽然名字很高端但是就 ...
随机推荐
- Denpendcy Injection 8.0新功能——KeyedService
Denpendcy Injection 8.0新功能--KeyedService 本文只介绍 .NET Denpendcy Injection 8.0新功能--KeyedService,假定读者已熟练 ...
- 看完这篇HTTP,跟面试官扯皮就没问题了(转)
认识 HTTP 首先你听的最多的应该就是 HTTP 是一种 超文本传输协议(Hypertext Transfer Protocol),这你一定能说出来,但是这样还不够,假如你是大厂面试官,这不可能是他 ...
- C51单片机开发
C51单片机开发笔记 定时器 C51中的定时器和计数器是同一个硬件电路支持的,通过寄存器配置不同,就可以将他当做定时器 或者计数器使用. 确切的说,定时器和计数器区别是致使他们背后的计数存储器加1的信 ...
- Angular2 通过自定义指令限制输入框输入类型
** 温馨提示:如需转载本文,请注明内容出处.** 本文链接:https://www.cnblogs.com/grom/p/16814577.html 在input控件中,使用type="n ...
- 解决 Steam 无法自动登录的问题
前言 劳动节假期闲的没事,重装一下电脑,结果电脑的 Steam 不会自动登录了,每次重启电脑就要重新输入密码和令牌.查了一下居然是 Windows 凭据管理器默认不会自动启动的问题. 解决方法 打开计 ...
- 关于Halcon中variation_model模型的快速解读。
十一期间在家用期间研读了下Halcon的variation_model模型,基本上全系复现了他的所有技术要求和细节,这里做个记录. 其实这个模型的所有原理都不是很复杂的,而且Halcon中的帮助文档也 ...
- 使用Blazor构建投资回报计算器
本文由葡萄城技术团队原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 本博客中创建的投资计算器根据存入金额和回报率计算每个投资周期的特定回报 ...
- 宏任务和微任务,同步异步,promis,await执行顺序
本文作为EVENLOOP事件循环的延伸: 执行顺序: ------------循环---------- | | ...
- QT(4)-QAbstractItemView
@ 目录 1 说明 2 常用函数 2.1 交替行颜色 2.1.1 alternatingRowColors 2.1.2 setAlternatingRowColors 2.2 autoScroll 2 ...
- Qt5 学习积累
目录 1.cout/cin 2.随机数 3.QSting. string.QChar,.char等的转换 4.退出 5.Qt::tr() 6.QFrame::shape,shadow 7.QCombo ...