【伪题解】 [Offer收割]编程练习赛58
【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的更多相关文章
- [hihocoder][Offer收割]编程练习赛58
最大的K-偏差排列 每次取可选范围里的最大的数字,如果最左侧的数字还没有使用就直接使用最左侧的数字 #pragma comment(linker, "/STACK:102400000,102 ...
- [Offer收割]编程练习赛46
[Offer收割]编程练习赛46赛后题解 A.AEIOU 分析
- hihocoder [Offer收割]编程练习赛4
描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望 ...
- hihocoder [Offer收割]编程练习赛61
[Offer收割]编程练习赛61 A:最小排列 给定一个长度为m的序列b[1..m],再给定一个n,求一个字典序最小的1~n的排列A,使得b是A的子序列. 贪心即可,b是A的子序列,把不在b中的元素, ...
- [Offer收割]编程练习赛4 A 满减优惠
满减优惠 描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的 ...
- [Offer收割] 编程练习赛1
A HihoCoder 1268 九宫 思路: 一般类似于数独的题目都是使用回溯解决,这里由于题目数据较小同样可以直接DFS得出结果.这里我用了一个偷懒的方法(next_permutation),直接 ...
- hihocoder [Offer收割]编程练习赛8
第一次做这种比赛,被自己坑的好惨... A.这道题的关键其实是如果有k和n满足kD+F>nL>kD则不能走无限远,分支看似难整理,其实比较简单,F>L根本就不用算了,明摆着就是Bsi ...
- ACM学习历程—Hihocoder [Offer收割]编程练习赛1
比赛链接:http://hihocoder.com/contest/hihointerview3/problem/1 大概有一个月没怎么打算法了.这一场的前一场BC,也打的不是很好.本来Div1的A和 ...
- HihoCoder1670 : 比赛日程安排([Offer收割]编程练习赛41)(模拟)
描述 H国编程联赛中有N只队伍,编号1~N. 他们计划在2018年一共进行M场一(队)对一(队)的比赛. 为了让参赛队员能得到充分的休息,联赛组委会决定:每支队伍连续两场比赛之间至少间隔一天.也就是如 ...
随机推荐
- vba功能语句
VBA语句集(第1辑) 定制模块行为(1) Option Explicit '强制对模块内所有变量进行声明Option Private Module '标记模块为私有,仅对同一工程中其它模块有用,在宏 ...
- centos安装python的虚拟环境和虚拟管理环境
一.大部分介绍的方式是使用pip安装:1.pip install virtualenv 2.pip install virtualenvwrapper 但是我安装完,并没有相应的命令:virt ...
- 【Todo】Java类面试题分析
Java 面试中的重要话题 多线程,并发及线程基础数据类型转换的基本原则垃圾回收(GC)Java 集合框架数组字符串GOF 设计模式SOLID (单一功能.开闭原则.里氏替换.接口隔离以及依赖反转)设 ...
- [Servlet&JSP] 标准标签
在JSP的规范中提供了一些标准标签(Standard Tag),全部的容器都支持这些标签,它能够协助编写JSP时降低Scriptlet的使用. 全部的标准标签都使用jsp:作为前置.这些标准标签是在J ...
- Win7 VNC远程连接Centos桌面
一,安装Linux桌面: yum -y groupinstall Desktop yum -y groupinstall "X Window System" yum -y grou ...
- 消息列队 php 基于redis 实现
说明 消息列队 基于PHP 实现. 之前 用python 的 flower 实现了 列队. 今天这里我们用的是 PHP 来实现: 在实际的业务环境中 PHP 用的多些: PHP 实现列队 最重要的是用 ...
- win10 UWP 申请微软开发人员
申请微软开发人员能够到https://dev.windows.com/zh-cn/programs/join 假设是学生,先去http://www.dreamspark.com/ 假设是英文,点stu ...
- China Vis 2015 会议小结
China Vis 2015 Paper有6个分会场.主要有 1.天气.气象.灾害可视化. 2.文本可视化应用: 3.树.网络.以及高维技术. 4.时空分析. 5.科学可视化与应用: 五个方面主题. ...
- xamarin.android listview绑定数据及点击事件
前言 listview是用来显示数据列表的一个控件,今天给大家带来如何使用cursor进行数据绑定以及点击事件. 导读 1.如何创建一个listview 2.如何使用cursor进行绑定数据 3.li ...
- RabbitMQ Connector
https://ci.apache.org/projects/flink/flink-docs-master/dev/connectors/rabbitmq.html RabbitMQ Source ...