【A:最大的K-偏差排列】:

第一次在hiho卡一题,所以暴力了搜索了一下,70分,后面回来打表找规律,规律是有和K有关的周期。

当K<=N/2时,成周期交叉变化,最后尾部部分单独考虑。

当K>N/2时,有三个序列,分别是[K+1...N]  [K...N-K+1 ] [1..N-K]

自己的代码:

#include<bits/stdc++.h>
using namespace std;
int ans[],N,K;
int main(){
int pos=,i,j;
scanf("%d%d",&N,&K);
if(K>=N-) {
for(i=N;i>=;i--) ans[++pos]=i;
}
else if(K<=N/){ //A
int tmp=N/(K*);
for(i=;i<=tmp;i++){
for(j=(i-)**K+;j<=(i-)**K+K;j++) ans[++pos]=j+K;
for(j=(i-)**K+;j<=(i-)**K+K;j++) ans[++pos]=j;
}
if(K>=N-tmp**K-) for(i=N;i>=tmp**K+;i--) ans[++pos]=i; //a //最后一部分同理。
else { //b
for(i=K+;i<=N-tmp**K;i++) ans[++pos]=i+*tmp*K;
for(i=K;i>N-tmp**K-K;i--) ans[++pos]=i+*tmp*K;
for(i=;i<=N-tmp**K-K;i++) ans[++pos]=i+*tmp*K;
}
}
else { //B
for(i=K+;i<=N;i++) ans[++pos]=i;
for(i=K;i>N-K;i--) ans[++pos]=i;
for(i=;i<=N-K;i++) ans[++pos]=i;
}
for(i=;i<=N;i++) printf("%d ",ans[i]);
return ;
}

别人的段代码:

#include<bits/stdc++.h>
using namespace std;
int used[];
int main(){
int N,K;
scanf("%d%d",&N,&K);
for (int i=;i<=N;i++){
int j=max(,i-K),up=min(N,i+K);
while(used[up]) up--;
while(j<up&&(used[j]||(i<N&&j>=i+-K))) j++;
used[j]=;
printf("%d ",j);
}
return ;
}

【B:孤独的字符】:

水题一个:对于每个字符,找到它做出贡献的范围,分别记录左边界L和右边界R,然后累计乘积。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=;
ll L[maxn],R[maxn],Laxt[],ans;
char c[maxn];
int main()
{
int N,i,j;
scanf("%s",c+);
N=strlen(c+);
for(i=;i<;i++) Laxt[i]=;
for(i=;i<=N;i++) {
L[i]=Laxt[c[i]-'a'];
Laxt[c[i]-'a']=i;
}
for(i=;i<;i++) Laxt[i]=N+;
for(i=N;i>=;i--) {
R[i]=Laxt[c[i]-'a'];
Laxt[c[i]-'a']=i;
}
for(i=;i<=N;i++) ans+=(ll)(i-L[i])*(R[i]-i);
cout<<ans<<endl;
return ;
}

【C:秋天来了】:

一眼感觉是差分约束题,但是发现由于每个条件的(L,R)之间的点都要加限制,限制条件过多,不行。

所以直接暴力一点去更新区间(L,R);很明显可以加优化:如果(L,R)之间的最大值都比Ai小,那就没必要更新了。

所以实际上暴力区间(L,R)的次数不会太多。(但是比赛后验证了一下,直接把线段树部分去掉,暴力就可以过。。。。)

#include<bits/stdc++.h>
using namespace std;
const int maxn=;
int h[maxn],x[maxn],y[maxn];
int Max[maxn<<];
void build(int Now,int L,int R){
if(L==R) {
Max[Now]=h[L]; return ;
}
int Mid=(L+R)>>;
build(Now<<,L,Mid);
build(Now<<|,Mid+,R);
Max[Now]=max(Max[Now<<],Max[Now<<|]);
}
void update(int Now,int L,int R,int pos,int val){
if(L==R) {
Max[Now]=val; return ;
}
int Mid=(L+R)>>;
if(Mid>=pos) update(Now<<,L,Mid,pos,val);
else update(Now<<|,Mid+,R,pos,val);
Max[Now]=max(Max[Now<<],Max[Now<<|]);
}
int qmax(int Now,int L,int R,int l,int r){
if(l<=L&&r>=R) return Max[Now];
int tmp=,Mid=(L+R)>>;
if(l<=Mid) tmp=max(tmp,qmax(Now<<,L,Mid,l,r));
if(r>Mid) tmp=max(tmp,qmax(Now<<|,Mid+,R,l,r));
return tmp;
}
int main()
{
int N,L,H,M,i,j;
scanf("%d%d%d%d",&N,&L,&H,&M);
for(i=;i<=N;i++) h[i]=H;
build(,,N);
for(i=;i<=M;i++) scanf("%d%d",&x[i],&y[i]);
bool Flag=true;
while(Flag){
Flag=false;
for(i=;i<=M;i++){
if(x[i]==y[i]) continue;
if(x[i]<y[i]){
if(qmax(,,N,x[i]+,y[i]-)>=h[x[i]]) {
for(j=x[i]+;j<y[i];j++)
if(h[j]>=h[x[i]]){
h[j]=h[x[i]]-;Flag=true;
update(,,N,j,h[j]);
}
}
} else {
if(qmax(,,N,y[i]+,x[i]-)>=h[x[i]]){
for(j=x[i]-;j>y[i];j--)
if(h[j]>=h[x[i]]){
h[j]=h[x[i]]-;Flag=true;
update(,,N,j,h[j]);
}
}
} }
}
for(i=;i<=N;i++) printf("%d\n",h[i]);
return ;
}

【D:Nim森林】:

不如没有前面两步,就是最后一个石子输的Nim博弈类型。

忽略前面两步,输的情况是:

1,全部石子堆的石子个数都为1,而且石子堆数为奇。

2,至少有两堆大于1的石子堆,且石子堆的石子异或值为0。

根据两个情况,可以骗到一些分。。。(但是我手速慢了,最后慌慌张张提交,0分。。。输出“No”都有10分,妈蛋

1,假如只有一堆: 如果这一堆只有X=1个,那么必输;否则,胜利的代价是X-1。

2,假如全部堆都有Xi=1;那么胜利代价是N-2;

...

【伪题解】 [Offer收割]编程练习赛58的更多相关文章

  1. [hihocoder][Offer收割]编程练习赛58

    最大的K-偏差排列 每次取可选范围里的最大的数字,如果最左侧的数字还没有使用就直接使用最左侧的数字 #pragma comment(linker, "/STACK:102400000,102 ...

  2. [Offer收割]编程练习赛46

    [Offer收割]编程练习赛46赛后题解 A.AEIOU 分析

  3. hihocoder [Offer收割]编程练习赛4

    描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望 ...

  4. hihocoder [Offer收割]编程练习赛61

    [Offer收割]编程练习赛61 A:最小排列 给定一个长度为m的序列b[1..m],再给定一个n,求一个字典序最小的1~n的排列A,使得b是A的子序列. 贪心即可,b是A的子序列,把不在b中的元素, ...

  5. [Offer收割]编程练习赛4 A 满减优惠

    满减优惠 描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的 ...

  6. [Offer收割] 编程练习赛1

    A HihoCoder 1268 九宫 思路: 一般类似于数独的题目都是使用回溯解决,这里由于题目数据较小同样可以直接DFS得出结果.这里我用了一个偷懒的方法(next_permutation),直接 ...

  7. hihocoder [Offer收割]编程练习赛8

    第一次做这种比赛,被自己坑的好惨... A.这道题的关键其实是如果有k和n满足kD+F>nL>kD则不能走无限远,分支看似难整理,其实比较简单,F>L根本就不用算了,明摆着就是Bsi ...

  8. ACM学习历程—Hihocoder [Offer收割]编程练习赛1

    比赛链接:http://hihocoder.com/contest/hihointerview3/problem/1 大概有一个月没怎么打算法了.这一场的前一场BC,也打的不是很好.本来Div1的A和 ...

  9. HihoCoder1670 : 比赛日程安排([Offer收割]编程练习赛41)(模拟)

    描述 H国编程联赛中有N只队伍,编号1~N. 他们计划在2018年一共进行M场一(队)对一(队)的比赛. 为了让参赛队员能得到充分的休息,联赛组委会决定:每支队伍连续两场比赛之间至少间隔一天.也就是如 ...

随机推荐

  1. 数学知识巧学JCF(Java Collections framework)

    不知你是否还记得高中我们学过的集合,映射,函数,数学确实很牛逼,拿它来研究java集合类,轻而易举的就把知识理解了.本篇文章适合初学java集合类的小白,也适合补充知识漏缺的学习者,同时也是面试者可以 ...

  2. codevs——1294 全排列

    1294 全排列  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 给出一个n, 请输出n的所有全 ...

  3. ACM用到的算法。先做个笔记,记一下

    ACM 所有算法 数据结构 栈,队列,链表 哈希表,哈希数组 堆,优先队列 双端队列 可并堆 左偏堆 二叉查找树 Treap 伸展树 并查集 集合计数问题 二分图的识别 平衡二叉树 二叉排序树 线段树 ...

  4. LinkedList类的基本方法的用法

    package cn.zmh.LinkedList; import java.util.Iterator; import java.util.LinkedList; public class Link ...

  5. BIM

    BIM进入中国已经有十来个年头,随着对BIM概念的深入了解.当前国内BIM应用逐渐由三维模型的可视化应用升级为基于BIM模型的信息进行项目精细化动态管理. 传统粗放的项目管理方法是工程项目难以进行精细 ...

  6. myBatis学习笔记(10)——使用拦截器实现分页查询

    1. Page package com.sm.model; import java.util.List; public class Page<T> { public static fina ...

  7. chromium爱好者不可错过的一个开源分支

    这次我要推荐下http://bloomberg.github.com/chromium.bb, 名字就叫chromium.bb,特点是专门的windows ports,关键是极大的简化了原版chrom ...

  8. linux的主分区与逻辑分区的关系

     主分区和扩展分区的差别在于主分区位于硬盘的最開始.MBR 扇区的位置.这个位置的数据在计算机启动时.会自己主动被 BIOS 读取而且运行,也就是说这个位置的分区表会自己主动被 BIOS 读取到内 ...

  9. Yii 清理缓存

    html: <button onclick="clearCache()">ClearCache</button> js: function clearCac ...

  10. cs6 mac 破解方法

    Photoshop CS6 重点功能: 1.Photoshop CS6 包含Photoshop CS6和Photoshop CS6 Extended中所有功能,快去试一试3D图像编辑和Photosho ...