拖了好久的题解,想想还是补一下吧。

A. King of Thieves

直接枚举起点和5个点之间的间距,进行判断即可。

 #include <bits/stdc++.h>
using namespace std; char s[]; int main()
{
//freopen("in.txt", "r", stdin); int n;
bool ans = false;
scanf("%d%s", &n, s);
for(int q = ; q < n && !ans; q++) if(s[q] == '*')
for(int l = ; q + *l < n; l++)
{
int i;
for(i = ; i <= ; i++) if(s[q + i*l] == '.') break;
if(i > ) { ans = true; break; }
} printf("%s\n", ans ? "yes" : "no"); return ;
}

代码君

B. Om Nom and Dark Park (DFS)

给一个完全二叉树,增加若干条边的权值,使得从根到每个叶节点的权值之和相同。

直接从下往上维护这颗树,累加所增加的权值。

 #include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = ( << ) + ;
LL a[maxn], num[maxn], ans, sum[maxn]; int n; void dfs(int o, int d)
{
if(d > n) return;
int lc = o*, rc = o*+;
dfs(lc, d+); dfs(rc, d+);
int m = max(sum[lc] + a[lc], sum[rc] + a[rc]);
ans += m - (sum[lc] + a[lc]);
ans += m - (sum[rc] + a[rc]);
sum[o] = m;
} int main()
{
//freopen("in.txt", "r", stdin); scanf("%d", &n);
for(int i = ; i < (<<(n+)); i++) scanf("%I64d", &a[i]);
dfs(, );
printf("%I64d\n", ans); return ;
}

代码君

C. Om Nom and Candies (部分贪心)

关于部分贪心可以看高逸涵的09年国家队论文。

这道题可以分成两种情况,用不同的办法来解决。

  • 有一种糖果的质量大于等于1000,那么我们枚举这种糖果的数量来求最大值。根据题目数据范围,循环的次数不会超过109 / 103 = 106.
  • 两种糖果的质量都小于1000,然后选一个性价比比较高的糖果。不妨设,那么我们说蓝色糖果的数量一定小于Wr。这样贪心的理由就是,如果有Wr个蓝色糖果,我们完全可以换成Wb个红色糖果。因为这种方案的糖果质量是一样的,但是总价值是HbWr < HrWb。所以我们可以枚举蓝色糖果的数量,来求最优解,并且循环的次数不超过1000.
 #include <bits/stdc++.h>
using namespace std;
typedef long long LL; int main()
{
LL c, hr, hb, wr, wb, ans = ;
scanf("%I64d%I64d%I64d%I64d%I64d", &c, &hr, &hb, &wr, &wb);
const int M = ;
if(wb > wr) { swap(hr, hb); swap(wr, wb); }
if(wr > M)
{
for(LL i = ; i * wr <= c; i++)
{
LL j = (c - i * wr) / wb;
ans = max(ans, (LL)i*hr + j*hb);
}
cout << ans << endl;
return ;
} if(hb*wr > hr*wb) { swap(hr, hb); swap(wr, wb); }
for(LL i = ; i <= wr && i * wb <= c; i++)
{
LL j = (c - i * wb) / wr;
ans = max(ans, i*hb+j*hr);
}
cout << ans << endl; return ;
}

代码君

D. Om Nom and Necklace (KMP)

题解转自:http://cyberzhg.github.io/blog/Online-Judge/CF526ABCDE/

这道题最终还是并没有看明白 r mod k是怎么来的,(⊙﹏⊙)b

 #include <cstdio>

 const int maxn =  + ;
char s[maxn];
int f[maxn], m, k; void getFail()
{
f[] = , f[] = ;
for(int i = ; i < m; i++)
{
int j = f[i];
while(j && s[i] != s[j]) j = f[j];
f[i+] = s[i] == s[j] ? j+ : ;
}
} int main()
{
//freopen("in.txt", "r", stdin);
scanf("%d%d%s", &m, &k, s);
getFail(); for(int i = ; i <= m; i++)
{
int l = i - f[i];
int R = i / l;
if(i % l == )
printf("%c", R / k >= R % k ? '' : '');
else
printf("%c", R / k > R % k ? '' : '');
}
printf("\n"); return ;
}

代码君

E. Transmitting Levels

在CF上发现了一种非常神的解法。首先预处理一下前缀和,然后用一个链表head[i]记录以第i个节点为结尾的,每段上的数之和不超过b的第一个数的下标。当这个跨度大于等于n的时候就说明找到答案了。

len就是记录分成了多少段。

我说的可能不太清楚,但是代码十分好懂,而且十分简练。感觉比官方题解要好很多。

但是我不太能证明它的正确性,为什么一旦找到i - head[i] >= n就输出答案了呢,也就是为什么后面不可能有最优解了呢?

 #include <cstdio>

 typedef long long LL;
const int maxn = + ;
LL a[maxn], sum[maxn], len[maxn], head[maxn]; int main()
{
//freopen("in.txt", "r", stdin); int n, q;
scanf("%d%d", &n, &q);
for(int i = ; i <= n; i++) { scanf("%I64d", &a[i]); a[i+n] = a[i]; }
for(int i = ; i <= n * ; i++) { sum[i] = sum[i-] + a[i]; head[i] = i; }
while(q--)
{
int b; scanf("%d", &b);
for(int i = n + , j = ; i <= n * ; i++)
{
while(sum[i] - sum[j] > b) j++;
head[i] = head[j];
len[i] = len[j] + ;
if(i - head[i] >= n) { printf("%I64d\n", len[i]); break; }
}
} return ;
}

代码君

最新文章

  1. Linux虚拟机的安装(使用Centos6.3)
  2. Winform窗体的基本控件
  3. bzoj3551 Peaks加强版
  4. webservice引用spring的bean
  5. javascript循环
  6. nodejs框架express4.x 学习--安装篇
  7. 设计模式学习--复合模式(Compound Pattern)
  8. spring3.1的BeanFactory与Quartz1.8整合
  9. latex列表
  10. 在webx.ml中 配置struts2 后 welcome-file-list 失效的解决办法
  11. 二度云抢先成为首批中国工信部(.vip/.xyz/.club)域名注册管理机构
  12. Linux安装Firefly
  13. HttpWatch工具简介及使用技巧(转载)
  14. 微信接口(一)创建菜单&amp;自动回复
  15. tomcat启动成功但是访问方面都是404
  16. java变量的作用域和基本数据类型转换
  17. 从n个元素中选择k个的所有组合(包含重复元素)
  18. JavaScript——历史与简介
  19. 如何开启mysql5.5的客户端服务 命令行打开方法
  20. Siege(开源Web压力测试工具)——多线程编程最佳实例

热门文章

  1. asp.net word ecxel类型文件在线预览
  2. zero to one:创业秘籍并不存在,因为任何创新都是新颖独特的,任何权威都不可能具体规定如何创新
  3. winform中的时间轴控件
  4. UVA 11610 Reverse Prime (数论+树状数组+二分,难题)
  5. POJ 1953
  6. 【bzoj2434-阿狸的打字机】AC自动机+fail树+优化
  7. Android 基于Socket的聊天应用(二)
  8. SinoSure
  9. android 检测工具: drozer
  10. 12个QT基本对话框,以及淡入原理(用定时器把窗口逐渐变成透明)