AtCoder Regular Contest 075 C D E (暂时)
C - Bugged
题意
给\(n\)个数,找其中的一个子集,使得其和最大,且不是\(10\)的整数倍。
思路
先对\(n\)个数求和,
- 如果本身即不被\(10\)整除,则即为答案。
- 否则,如果本身被\(10\)整除,则找到这\(n\)个数中最小的不被\(10\)整除的数,减去它即为答案。
- 如果不存在这样的数,说明所有的数都被\(10\)整除,所以答案为\(0\).
回顾上述过程,可以发现,这个子集的\(size\)要么是\(0\),要么是\(n-1\),要么是\(n\).
解题无关部分
结论
满足条件的子集的\(size\)要么是\(0\),要么是\(n-1\),要么是\(n\)
证明
\(size=0,n\)的情况显然
对于其余情况,即\(10\mid \sum_{i=1}^{n}a_i\)而\(\exists a_i,10\nmid a_i\)时
假设存在一个\(size=n-k(k\gt 1)\)的子集,那么\(10\nmid (sum0=\sum_{i=1}^{n-k}a_i)而10\mid (sum=\sum_{i=1}^{n}a_i\)),因而\(10\nmid \sum_{i=n-k+1}^{n}a_i\)
因为\(k\gt 1\),所以\(\sum_{i=n-k+1}^{n}a_i=\sum_{i=n-k+1}^{n-1}a_i+a_n=A+B\),因为\(10\nmid (A+B)\),所以\(A,B\)中至少存在一个不被\(10\)整除。
\(Case 1.\) \(10\mid A, 10\nmid B\)
则有\(10\nmid (sum0+A)=\sum_{i=1}^{n-1}a_i\),即为一个\(size=n-1\)的子集
\(Case 2.\) \(10\nmid A, 10\mid B\)
则有\(10\nmid (sum0+B)=\sum_{i=1}^{n-k}a_i+a_n\),即得到一个\(size=n-k+1\)的子集,变成原问题的子问题,可在此基础上继续操作直至得到一个\(size=n-1\)的子集。
\(Case 3.\) \(10\nmid A, 10\nmid B\)
在此条件下,必然有\(10\nmid (sum0+A)且10\nmid (sum0+B)\)
(否则,如果\(10\mid (sum0+A)\),而又有条件\(10\nmid B\),因而\(10\nmid (sum0+A+B)=sum\)与题设矛盾;
如果\(10\mid (sum0+B)\)同理)
因而,可以做出与\(Case. 1\)中相同的选择,取\(10\nmid (sum0+A)\)这个\(size=n-1\)的子集,即满足要求。
Code
#include <bits/stdc++.h>
#define maxn 110
using namespace std;
typedef long long LL;
int a[maxn];
int main() {
int n;
scanf("%d", &n);
int sum=0;
for (int i = 0; i < n; ++i) scanf("%d", &a[i]), sum += a[i];
sort(a,a+n);
if (sum % 10) printf("%d\n", sum);
else {
int i=0;
for (; i < n; ++i) if (a[i] % 10) break;
if (i == n) puts("0");
else printf("%d\n", sum-a[i]);
}
return 0;
}
D - Widespread
题意
有\(n\)个小怪,每个小怪都有血量\(h_i\). 攻击某一个小怪,可对它造成\(A\)的伤害,对其他所有小怪造成\(B\)的伤害\((A\gt B)\)。问最少攻击多少次能消灭所有小怪。
思路
假设一共攻击了\(k\)次,攻击过\(p\)个小怪(攻击第\(i\)个小怪\(t_i\)次),则有$$k=t_1+t_2+...+t_p$$
对第\(i\)个小怪造成的伤害为$$(k-t_i)B+t_iA=kB+(A-B)t_i$$显见血越厚需要花费的\(t_i\)就越多。
因此,可以二分攻击次数\(k\),\(check\)的标准是\(\sum_{}t_i\)是否小于等于\(k\).
Code
#include <bits/stdc++.h>
#define maxn 100010
using namespace std;
typedef long long LL;
int n, A, B;
int a[maxn];
bool check(LL k) {
LL base = k * B, diff = A - B, sum = 0;
for (int i = n-1; i >= 0; --i) {
if (a[i] <= base) continue;
sum += ceil(1.0 * (a[i] - base) / diff);
}
return sum <= k;
}
int main() {
scanf("%d%d%d", &n, &A, &B);
LL ri = 0;
for (int i = 0; i < n; ++i) scanf("%d", &a[i]), ri += a[i]/B+1;
sort(a, a+n);
LL le = 1;
while (ri > le) {
LL mid = le + ri >> 1;
if (check(mid)) ri = mid;
else le = mid + 1;
}
printf("%lld\n", le);
return 0;
}
E - Meaningful Mean
题意
给定一个数组\(a[\ ]\)与一个数字\(k\),问有多少对\((l,r)\)满足$$\frac{\sum_{i=l}^{r}a[i]}{r-l+1}\geq k$$即问有多少子段的平均数\(\geq k\)
思路
转化
将数组中每一个数都减去\(k\),则问题转化为有多少段数的和\(\geq 0\)
树状数组
处理出前缀和,再用树状数组进行统计(思想类似逆序对个数)。
\(sum[l,r] = Sum[r] - Sum[l-1]\),因此前缀和应包括\(0\)
Code
#include <bits/stdc++.h>
#define maxn 200010
using namespace std;
typedef long long LL;
LL c[maxn], a[maxn], b[maxn];
int n, k, tot;
int lowbit(int x) { return x & (-x); }
LL query(int x) { LL ret=0; while (x) ret += c[x], x -= lowbit(x); return ret; }
void add(int x) { while (x <= tot) ++c[x], x += lowbit(x); }
int main() {
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; ++i) scanf("%lld", &a[i]), a[i] -= k;
for (int i = 1; i <= n; ++i) b[i] = (a[i] += a[i-1]);
b[n+1] = 0;
sort(b+1, b+2+n);
tot = unique(b+1, b+2+n) - (b+1);
LL ans=0;
a[0] = 0;
for (int i = 0; i <= n; ++i) {
int p = lower_bound(b+1, b+1+tot, a[i]) - b;
ans += query(p);
add(p);
}
printf("%lld\n", ans);
return 0;
}
AtCoder Regular Contest 075 C D E (暂时)的更多相关文章
- AtCoder Regular Contest 075 2017年6月4日 C、D、E题解
http://arc075.contest.atcoder.jp/assignments 昨晚做的atcoder,今天写个简单题解. F题不会做,800point的,就跪了,要等zk大佬来做.zk能做 ...
- AtCoder Regular Contest 075
任意门 C - Bugged 题意:类似装箱问题,但是最后体积总和不能为10的倍数. #include<cstdio> #include<cstring> #include&l ...
- AtCoder Regular Contest 075 E - Meaningful Mean(树状数组)
题目大意:求一个数组中,平均值不小于k的连续子序列个数 所有数减去k,算个前缀和出来,就变成二维数点问题了. 没有修改,离线的话就是CZL所说的“NOIP最喜欢的套路”了:倒着加进BIT,以权值为数组 ...
- AtCoder Regular Contest 075 D Widespread
题目传送门 这道题其实二分一下答案就okay了的 不过LL什么的有时候忘了加 被卡了下 #include<cstdio> #include<cstring> #include& ...
- 【arc075f】AtCoder Regular Contest 075 F - Mirrored
题意 给定一个数x,问有多少个正整数y,使得rev(y)-y==x 其中rev(x)表示x按位翻转之后得到的数. x<=1e9 做法 首先通过打表发现,这个答案不会很大. 这就说明解相当地松弛. ...
- AtCoder Regular Contest 094 (ARC094) CDE题解
原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...
- AtCoder Regular Contest 061
AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...
- AtCoder Regular Contest 092
AtCoder Regular Contest 092 C - 2D Plane 2N Points 题意: 二维平面上给了\(2N\)个点,其中\(N\)个是\(A\)类点,\(N\)个是\(B\) ...
- AtCoder Regular Contest 093
AtCoder Regular Contest 093 C - Traveling Plan 题意: 给定n个点,求出删去i号点时,按顺序从起点到一号点走到n号点最后回到起点所走的路程是多少. \(n ...
随机推荐
- 最新手机号正则表达式php包括166等号段
if(!preg_match("/^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199|(147)) ...
- JZOJ 4722. 跳楼机
Description DJL为了避免成为一只咸鱼,来找srwudi学习压代码的技巧.Srwudi的家是一幢h层的摩天大楼.由于前来学习的蒟蒻越来越多,srwudi改造了一个跳楼机,使得访客可以更方 ...
- 43.VUE学习之--组件之使用.sync修饰符与computed计算属性超简单的实现美团购物车原理
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Python学习笔记(三):文件和集合操作
python string与list互转 因为python的read和write方法的操作对象都是string.而操作二进制的时候会把string转换成list进行解析,解析后重新写入文件的时候,还得 ...
- 基于Ajax提交formdata数据、错误信息展示和局部钩子、全局钩子的校验。
formdata重点: 实例化FormData这个类 循环serializeArray可以节省代码量 图片要用$('#id')[0].files[0]来获得 加上contentType:false和p ...
- 二分答案:Poweroj2461-入门基础之二分答案(二分法的应用)
传送门:点击打开链接 入门基础之二分答案 Time Limit: 1000 MS Memory Limit: 65536 KBTotal Submit: 179 Accepted: 33 Page V ...
- [bzoj1912]异象石(set)
Description Adera是Microsoft应用商店中的一款解谜游戏. 异象石是进入Adera中异时空的引导物,在Adera的异时空中有一张地图.这张地图上有N个点,有N-1条双向边把它们连 ...
- [译]Exactly once is NOT exactly the same
近日学习Pulsar文档时,注意到Pulsar提到其提供的是effectively-once语义,而不是其它流计算引擎announce的exactly-once语义,并引用了Exactly once ...
- Android TV 开发(2)
本文来自网易云社区 作者:孙有军 首先来看看拨号界面的配置代码: <LinearLayout xmlns:android="http://schemas.android.com/apk ...
- Mybatis使用- Mybatis JdbcType与Oracle、MySql数据类型对应列表 ; Mybatis中javaType和jdbcType对应关系
Mybatis JdbcType与Oracle.MySql数据类型对应列表 Mybatis JdbcType Oracle MySql JdbcType ARRAY JdbcType BIG ...