Codeforces Round #515 (Div. 3) 解题报告(A~E)
题目链接:http://codeforces.com/contest/1066
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<queue>
#include<vector>
#include<set>
#include<map>
#define closeio std::ios::sync_with_stdio(false)
using namespace std;
typedef long long ll;
int t,L,v,l,r;
int main()
{
cin>>t;
while(t--)
{
scanf("%d%d%d%d",&L,&v,&l,&r);
int ans = L / v;
ans = ans - (r/v - (l-)/v);
cout<<ans<<endl;
}
return ;
}
1066 B Heaters
题意:Vova的房子由从1到n的房间组成。这些房间从左到右排成一排相互连通,有的房间放着火炉。火炉工作时可以温暖以其所在的第pos个房间为中心, [pos−r+1;pos+r−1]这个区间的所有房间。现在给定n个房间的火炉信息和r,求最少需要开几个火炉可以使整个房子都温暖。
分析:贪心,例如对于起始点1来说,在能覆盖到点1的所有火炉中,我们选最靠后的那一个。之后的每次处理就是把新的第一个没有覆盖到的点看成起始点继续贪心。这样可以保证每次选择覆盖的区间尽可能大。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<queue>
#include<vector>
#include<set>
#include<map>
#define closeio std::ios::sync_with_stdio(false)
using namespace std;
const int maxn = ;
int n,r,a[maxn],ans;
bool flag;
int main()
{
int i,j;
while(cin>>n>>r)
{
flag = true;
memset(a,,sizeof(a));
for(i=;i<=n;i++)
scanf("%d",&a[i]);
int pos = ;//pos指向最后放置的炉子的位置
for(i = r;i >= ; i--)
{
if(a[i] == )
{
pos = i;
ans = ;
break;
}
}
if(i == ) flag = false;
while(pos + r - < n && flag)//pos+r-1是当前所放最后一个炉子能覆盖的最右点
{
for(i = pos+r*-;i >= pos; i--)//pos+r*2-1是下一个炉子可以存在的位置的最远点,注意这里值可能比1000大,所以数组范围开大些
{
if(a[i] == )
{
if(i == pos) //pos后的长度为2*r-1的区间没有炉子
flag = false;
else
{
pos = i;
ans ++;
}
break;
}
}
}
printf("%d\n",flag?ans:-);
}
return ;
}
1066 C Books Queries
题意:你有一个书架,可以对它进行三种操作:L id表示把编号为id的书放在所有书的最左边。R id表示表示把编号为id的书放在所有书的最右边。? id表示询问编号为id的书距离整个书列的最外侧(左侧或右侧)的最小值。
分析:题目给定的操作数量和id的范围均为2*1e5,所以可以开一个2*1e5大小的数组存放每本书的位置。我们可以设置posx和posy分别指向书列的左右两侧的位置,当有书放进来时改变posx和posy的值并赋给a[id],查询操作如上所述。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<queue>
#include<vector>
#include<set>
#include<map>
#define closeio std::ios::sync_with_stdio(false)
using namespace std;
const int maxn = ;
int a[maxn],id,q,posx,posy;
char c;
int main()
{
cin>>q;
posx = posy = ;
memset(a,,sizeof(a));
while(q--)
{
getchar();
scanf("%c %d",&c,&id);
if(c == 'L')
{
a[id] = posx--;
}
if(c == 'R')
{
a[id] = ++posy;
}
if(c == '?')
{
cout<<min(a[id] - posx - ,posy - a[id])<<endl;
}
}
return ;
}
1066 D Boxes Packing
题意:这个题的题意很蛋疼QAQ不想扯,出题人就是想通过题意把你带跑。其实是最简单的一个题,就是给你n个物品,让你放进m个容量为k的箱子里,要求是只能取从最后一个开始连续的物品,问最多装几个物品。
分析:直接从后往前扫一遍得出答案。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<queue>
#include<vector>
#include<set>
#include<map>
#define closeio std::ios::sync_with_stdio(false)
using namespace std;
const int maxn = ;
int n,m,k,ans,pos;
int a[maxn],b[maxn];
int main()
{
int i,j;
while(cin>>n>>m>>k)
{
for(i = ;i <= n; i++)
scanf("%d",&a[i]);
for(i = ;i <= m;i++)
b[i] = k;
j = m;
ans = ;
for(i = n;i >= ; i--)
{
if(b[j] >= a[i])
{
b[j] -= a[i];
ans ++;
}
else
{
if(j > )
{
b[--j] -= a[i];
ans ++;
}
else
{
break;
}
}
}
cout<<ans<<endl;
}
return ;
}
1066 E Binary Numbers AND Sum
题意:给你长为n的二进制数a和长为m的二进制数b,每次操作把a&b的十进制结果累加起来,然后把b往右移一位直到b为0。最后结果对998244353998244353取余。
分析:这个题还是非常不错的一道题的。对于a的每一个为1的二进制位,其对答案的贡献就是所有a&b操作后a的这一位仍为1的次数再乘上这一位为1对应的十进制数。所以我们预处理一下pw数组存放二进制位为1对应的10进制数取余,sum数组则存放前缀和,sum[i]即为第i位及其之前b里有几个1。考虑到n与m可能不相等,我们预处理一下a,b使其长度一致。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<queue>
#include<vector>
#include<set>
#include<map>
#define closeio std::ios::sync_with_stdio(false)
using namespace std;
typedef long long ll;
const ll mod = ;
const int maxn = ;
ll n,m,pw[maxn],sum[maxn];
string a,b;
void init_ab()
{
if(n > m) b = string(n-m,'') + b;
else if(m>n) a = string(m-n,'') + a; memset(sum,,sizeof(sum));
memset(pw,,sizeof()); int i,j;
pw[] = ;
for(i = ;i < maxn; i++) pw[i] = pw[i-] * % mod;//预处理pw数组
}
int main()
{
int i,j,k;
while(cin>>n>>m)
{
ll ans = ;
closeio;
a.clear();
b.clear();
cin>>a>>b;
init_ab();
k = max(n,m);
sum[] = b[]=='';
for(i = ;i < k;i++)
sum[i] = sum[i-] + (b[i] == '');//sum[i]存放第i位及其之前b里有多少位为1
for(i = ;i < k;i ++)
{
if(a[i]-'')//a[i]为1才对答案有贡献
{
ans = (ans + pw[k-i-] * sum[i] % mod) % mod;//所有a&b操作后a的这一位仍为1的次数再乘上这一位为1对应的十进制数
}
}
cout<<ans<<endl;
}
return ;
}
Codeforces Round #515 (Div. 3) 解题报告(A~E)的更多相关文章
- Codeforces Round #324 (Div. 2)解题报告
---恢复内容开始--- Codeforces Round #324 (Div. 2) Problem A 题目大意:给二个数n.t,求一个n位数能够被t整除,存在多组解时输出任意一组,不存在时输出“ ...
- Codeforces Round #382 (Div. 2) 解题报告
CF一如既往在深夜举行,我也一如既往在周三上午的C++课上进行了virtual participation.这次div2的题目除了E题都水的一塌糊涂,参赛时的E题最后也没有几个参赛者AC,排名又成为了 ...
- Codeforces Round #380 (Div. 2) 解题报告
第一次全程参加的CF比赛(虽然过了D题之后就开始干别的去了),人生第一次codeforces上分--(或许之前的比赛如果都参加全程也不会那么惨吧),终于回到了specialist的行列,感动~.虽然最 ...
- Codeforces Round #216 (Div. 2)解题报告
又范低级错误! 只做了两题!一道还被HACK了,囧! A:看了很久!应该是到语文题: 代码:#include<iostream> #include<]; ,m2=; ;i ...
- Codeforces Round #281 (Div. 2) 解题报告
题目地址:http://codeforces.com/contest/493 A题 写完后就交了,然后WA了,又读了一遍题,没找出错误后就开始搞B题了,后来回头重做的时候才发现,球员被红牌罚下场后还可 ...
- Codeforces Round #277 (Div. 2) 解题报告
题目地址:http://codeforces.com/contest/486 A题.Calculating Function 奇偶性判断,简单推导公式. #include<cstdio> ...
- Codeforces Round #276 (Div. 2) 解题报告
题目地址:http://codeforces.com/contest/485 A题.Factory 模拟.判断是否出现循环,如果出现,肯定不可能. 代码: #include<cstdio> ...
- Codeforces Round #350 (Div. 2)解题报告
codeforces 670A. Holidays 题目链接: http://codeforces.com/contest/670/problem/A 题意: A. Holidays On the p ...
- Codeforces Round #479 (Div. 3)解题报告
题目链接: http://codeforces.com/contest/977 A. Wrong Subtraction 题意 给定一个数x,求n次操作输出.操作规则:10的倍数则除10,否则减1 直 ...
随机推荐
- 4521: [Cqoi2016]手机号码
4521: [Cqoi2016]手机号码 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1030 Solved: 609 [Submit][Statu ...
- [JSOI2008]火星人
嘟嘟嘟 嗯. splay维护哈希. 如题,用splay维护哈希,查找的时候二分.所以复杂度是取决于询问复杂度:\(O(n \log^ 2{n})\). 这道题还有一个技巧,就是一个节点记录的是他的子树 ...
- 记一次爬虫经历(友话APP的Web端)
背景:学校为迎接新生举办了一个活动,在友话APP的校园圈子内发布动态即可参与活动,最终抽取数名同学赠送福利. 分析:动态的数量会随着迎新的开始逐渐增加,人工统计显然不现实,因此可以使用爬虫脚本在友话A ...
- nodejs实现mysql数据库的简单例子
在MySQLWorkbench中创建table存储用户的tokenId信息: use token; SET FOREIGN_KEY_CHECKS = ; DROP TABLE IF EXISTS `a ...
- Solr服务在Linux上的搭建详细教程
一.系统环境 注:欢迎大家转载,非商业用途请在醒目位置注明本文链接和作者名dijia478即可,商业用途请联系本人dijia478@163.com. CentOS-6.7-i386-bin-DVD1 ...
- 深入理解C/C++混合编程优秀博文赏析与学习
1.深入理解C/C++混合编程 2.C/C++ 混合编程 互相调用 3.C代码中如何调用C++ C++中如何调用C 4.C和C++混合编程
- 初识Qt鼠标、键盘事件及定时器和随机数
1.新建Qt Gui应用,项目名称为“myEvent”,基类名称为QWidget,类名称为Widget. 2.widget.h文件中添加以下代码,该段代码中包含了三个事件函数和一个槽函数 privat ...
- python 语言学入门第一课必看:编码规范
命名 module_name, package_name, ClassName, method_name, ExceptionName, function_name, GLOBAL_VAR_NAME, ...
- ios应用数据存储方式(XML属性列表-plist) - 转
一.ios应用常用的数据存储方式 1.plist(XML属性列表归档) 2.偏好设置 3.NSKeydeArchiver归档(存储自定义对象) 4.SQLite3(数据库,关系型数据库,不能直 ...
- 能够让你装逼的10个Python小技巧
列表推导式 你有一个list: bag = [1, 2, 3, 4, 5] 现在你想让所有元素翻倍,让它看起来是这个样子: [2, 4, 6, 8, 10] 大多初学者,根据之前语言的经验会大概这 ...