5 November in 614
Contest
A. ssoj2964 交错的士兵
\(n\) 个数的排列,从左到右依次为 1, 2, …, \(n\)。\(n\) 次操作,对于第 \(i\) 次操作,从左到右分成很多段,每段 \(i\) 个,若末尾有剩余,剩余部分自成一段;然后对于每一段,段中第一个数移动到该段末尾,其余数向左移动对齐。输出经过 \(n\) 次操作后的排列。\(1\le n\le 10^6\)。
[input] 4
[output] 4 2 3 1
显然 \(n^2\) 模拟会超时。考虑 \(O(n\log n)\) 做法:观察到每次操作仅每段第一个数有较大位移,其余数仅仅向左移动一位。所以如果不移动其余数,仅移动数列头、尾指针和每段第一个数。
代码实现坑点很多。
#include <cstdio>
#include <algorithm>
using namespace std;
int n, d[2000006];
int main() {
scanf("%d", &n);
for (int i=1; i<=n; ++i) d[i]=i;
for (int i=2; i<=n; ++i) {
for (int j=n/i*i-(n%i==0?i:0)+i-1; j>=i-1; j-=i)
d[min(n+i-1,j+i)]=d[j];
}
for (int i=n; i<n+n; ++i) printf("%d ", d[i]);
return 0;
}
B. ssoj2965 乙女文楽
\(n\) 个数的数列。不多于 \(k\) 次修改机会,每次修改将删去所有值为 \(x\) 的数。最大化连续等值区间长度。\(1\le n\le 10^5,0\le k\le n-1, 1\le a_i\le n\)。
尺取法。维护区间头尾指针,保证区间中不多于 \(k+1\) 种数值。随时更新答案。
#include <cstdio>
#include <algorithm>
using namespace std;
int n, k, a[100005], ans, cnt, col[100005];
int main() {
scanf("%d%d", &n, &k);
for (int i=1; i<=n; ++i) scanf("%d", &a[i]);
for (int i=1, j=1; i<=n; ++i) {
if (++col[a[i]]==1) ++cnt;
while (cnt>k+1) if (--col[a[j++]]==0) --cnt;
ans=max(ans, col[a[i]]);
}
printf("%d\n", ans);
return 0;
}
C. ssoj2674 Delicious Apples
一个环长度为 \(L\), 上面有 \(n\) 棵树,篮子一次可装 \(k\) 个苹果;给出每棵树的位置和树上的苹果数,求将所有苹果运回原点的最少的总距离。\(1\le n,k\le 10^5,\sum a_i\le 10^5,1\le L\le 10^9\)。
贪心。根据题目意思,有 “原路返回” 和 “走一圈” 两种走法。显然,当只有不多于 \(k\) 个苹果且位于环下部时,走一整圈更优;对于其他情况,显然原路返回更优。实际上,可以证明最优解中只有不多于一次 “走一圈”。
对苹果树离散,分为左右半边,分别贪心。枚举 “走一圈” 包含的苹果数量。
#include <cstring>
#include <cstdio>
#include <algorithm>
#define ll long long
using namespace std;
int T, n, L, k;
ll sl[100005], sr[100005], l[100005], r[100005], lt, rt, ans;
inline int read() {
char c; while (!isdigit(c=getchar()));
int v=c-48; while (isdigit(c=getchar())) v=v*10+c-48;
return v;
}
int main() {
T=read();
while (T--) {
memset(sl, 0, sizeof(sl)), memset(sr, 0, sizeof(sr)),
memset(l, 0, sizeof(l)), memset(r, 0, sizeof(r));
L=read(), n=read(), k=read();
lt=0, rt=0;
for (int i=1, pos, num; i<=n; ++i) {
pos=read(), num=read();
if ((pos << 1)<=L) while (num--) l[++lt]=pos;
else while (num--) r[++rt]=L-pos;
}
sort(l+1, l+1+lt), sort(r+1, r+1+rt);
for (int i=1; i<=lt; ++i) {
if (i<=k) sl[i]=l[i]; else sl[i]=sl[i-k]+l[i];
}
for (int i=1; i<=rt; ++i) {
if (i<=k) sr[i]=r[i]; else sr[i]=sr[i-k]+r[i];
}
ans=(sl[lt]+sr[rt])<<1;
for (int i=1; i<=lt && i<=k; ++i) {
ll Le=lt-i, Ri=rt-k+i;
ans=min(ans, ((sl[Le]+sr[Ri])<<1)+L);
}
printf("%lld\n", ans);
}
return 0;
}
本题代码调试过程中出现玄学错误。太痛苦了……
D. 三角形牧场 (pasture)
和所有人一样,奶牛喜欢变化。它们正在设想新造型的牧场。奶牛建筑师 Hei 想建造围有漂亮白色栅栏的三角形牧场。 她拥有 \(N\) (\(3≤N≤40\)) 块木板,每块的长度 \(L_i\) (\(1≤L_i≤40\)) 都是整数,她想用所有的木板围成一个三角形使得牧场面积最大。 请帮助 Hei 小姐构造这样的牧场,并计算出这个最大牧场的面积。
暴力枚举三角形两边长度(第三边可以推算出来,即与总长相减),对于所有可能的三角形,Heron 公式更新答案。易证三角形任意一边长度不超过总长的一半。Heron 公式:\(S=\sqrt{p(p-a)(p-b)(p-c)}\), 其中 \(\displaystyle p=\frac{a+b+c}{2}\).
预处理三角形可能的两边,复杂度 $O(np^2)\approx O(n^5) $。
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const double eps=1e-5;
int n, x[43], L, p;
int f[803][803];
double ans;
int main() {
scanf("%d", &n);
for (int i=1; i<=n; ++i) scanf("%d", &x[i]), L+=x[i];
double p=L/2.0;
f[0][0]=1;
for (int i=1; i<=n; ++i)
for (int a=p; a>=0; --a) for (int b=p; b>=0; --b)
if (a>=x[i] && f[a-x[i]][b] || b>=x[i] && f[a][b-x[i]])
f[a][b]=1;
for (int a=p; a; --a) for (int b=p; b; --b) if (f[a][b]) {
int c=L-a-b;
if (a<p && b<p && c<p)
ans=max(ans, (p-a)*(p-b)*(p-c));
}
if (ans<eps) printf("-1\n");
else printf("%d\n", (int)(sqrt(p*ans)*100));
return 0;
}
在逻辑运算当中,|| 和 && 是 短路符号,| 和 & 不是。而运算符优先级 |、& 要比 ||、&& 高,其中 || 比 && 高。利用以上几点即可继续缩短代码。
5 November in 614的更多相关文章
- 8 November in 614
我开始看心灵鸡汤了-- 每当在书中读及那些卑微的努力,都觉得感动且受震撼.也许每个人在发出属于自己的光芒之前,都经历了无数的煎熬,漫长的黑夜,无尽的孤独,甚至不断的嘲讽和否定,但好在那些踮脚的少年,最 ...
- 7 November in 614
每日总结不能少!让自己的头脑好好清醒清醒,才不会犯那些所谓的低级错误! Contest A. ssoj3045 A 先生砍香蕉树 根据数据范围 \(m\le 1000,b\le 10000\),显然本 ...
- 6 November in 614
Contest A. greet map,完了. B. gift map,完了. C. [Usaco2008 Nov Gold] 安慰奶牛 最小生成树.新边权设为原边权的两倍,再加上两端点的点权.完了 ...
- [POJ1765]November Rain
[POJ1765]November Rain 试题描述 Contemporary buildings can have very complicated roofs. If we take a ver ...
- We will be discontinuing the Nitrous Development Platform and Cloud IDE on November 14th, 2016.
我表示我很难过 Nitrous We will be discontinuing the Nitrous Development Platform and Cloud IDE on November ...
- TIOBE Index for November 2015(转载)
原文地址:http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html November Headline: Java once a ...
- 日常英语---七、[Updated November 14 at 4:10 PM PST] Scheduled Game Update - November 14, 2018(n.标准)
日常英语---七.[Updated November 14 at 4:10 PM PST] Scheduled Game Update - November 14, 2018(n.标准) 一.总结 一 ...
- Multi-Cloud & Kubernetes: Cloud Academy November 2018 Data Report
https://cloudacademy.com/research/multi-cloud-kubernetes-devops-cloud-academy-data-report-nov-18/ No ...
- ACM ICPC 2010–2011, Northeastern European Regional Contest St Petersburg – Barnaul – Tashkent – Tbilisi, November 24, 2010
ACM ICPC 2010–2011, Northeastern European Regional Contest St Petersburg – Barnaul – Tashkent – Tbil ...
随机推荐
- Nginx 模块 - ngx_http_rewrite_module
原文地址 ngx_http_rewrite_module 模块用于通过 PCRE 正则表达式改变请求 URI,返回重定向并可以有条件地选择配置. break.if.return.rewrite 以及 ...
- oracle三大范式
范式: 设计数据库定义的一个规则, 三大范式, 灵活运用, 人的思想是活的 一范式 1, 不存在冗余数据 同一个表中的记录不能有重复----所以主键(必须有) 2, 每个字段必须是不可再分的信息(列不 ...
- oracle用户权限管理
oralce对权限管理比较严谨,普通用户之间也是默认不能互相访问的,需要互相授权 1.查看当前数据库所有用户: select * from all_users; 2.查看表所支持的权限: select ...
- 最小割树(Gomory-Hu Tree)求无向图最小割详解 附 BZOJ2229,BZOJ4519题解
最小割树(Gomory-Hu Tree) 前置知识 Gomory-Hu Tree是用来解决无向图最小割的问题的,所以我们需要了解无向图最小割的定义 和有向图类似,无向图上两点(x,y)的割定义为一个边 ...
- 获取Linux内核未导出符号的几种方式
从Linux内核的2.6某个版本开始,内核引入了导出符号的机制.只有在内核中使用EXPORT_SYMBOL或EXPORT_SYMBOL_GPL导出的符号才能在内核模块中直接使用.然而,内核并没有导出所 ...
- How to exploit the x32 recvmmsg() kernel vulnerability CVE 2014-0038
http://blog.includesecurity.com/2014/03/exploit-CVE-2014-0038-x32-recvmmsg-kernel-vulnerablity.html ...
- jar包 war包
jar包和war包的区别: war是一个web模块,其中需要包括WEB-INF,是可以直接运行的WEB模块.而jar一般只是包括一些class文件,在声明了Main_class之后是可以用java命令 ...
- python学习第二十五天函数位置参数和关键词参数
函数位置参数顾名思义就是按位置排序,按位置对应参数,位置一一对应,函数的关键词参数是不按照顺序来的,可以指定的参数传值.但是注意的是,位置参数必须在关键词参数之前. 1,函数位置参数 def good ...
- Windows下anaconda安装opencv
win+R打开cmd界面,输入conda create -n opencv python=3.6,创建名为opencv的虚拟空间,然后一路y,直到安装完成. activate opencv 然后输入 ...
- NGUI多行输入框和滚动条结合使用(text list script 和scroll bar script)
一,我们添加一个label,如下图:将label属性设置 二,给label添加一个box collider.然后在add component 添加test list,如下图: 三,添加一个脚本Test ...