【伪题解】 [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场一(队)对一(队)的比赛. 为了让参赛队员能得到充分的休息,联赛组委会决定:每支队伍连续两场比赛之间至少间隔一天.也就是如 ...
随机推荐
- 有关 GCC 及 JNA 涉及动态库/共享库时处理库文件名的问题
动态库尤其是共享库在 Linux 环境下普遍存在库文件名包含版本号的情况,比如 Linux 环境下经常会发现一个共享库的真实文件名是 libfoo.so.1.1.0,而同时会有多个指向该真实库文件的软 ...
- android 活动
一.Activity 声明周期 1 创建 把页面上的个元素加载到内存 onCreate 2 开始 把页面显示到屏幕 onStart 3 恢复 让页面在屏幕活动 onResume 4 暂停 停止页面动作 ...
- Linux最常用的命名
一.环境配置 vim /etc/sysconfig/network-scripts/ifcfg-eth0 vim /etc/sysconfig/network vim /etc/hostname vi ...
- 大话大前端时代(一) —— Vue 与 iOS 的组件化
序 今年大前端的概念一而再再而三的被提及,那么大前端时代究竟是什么呢?大前端这个词最早是因为在阿里内部有很多前端开发人员既写前端又写 Java 的 Velocity 模板而得来,不过现在大前端的范围已 ...
- 查询公司外网ip方法
curl -s "http://checkip.dyndns.org/"|cut -f 6 -d" "|cut -f 1 -d"<" ...
- poj 2135 Farm Tour 最小费最大流
inf开太小错了好久--下次还是要用0x7fffffff #include<stdio.h> #include<string.h> #include<vector> ...
- java开始到熟悉72-76
本次内容:异常机制 1.为什么需要异常 2.异常 3.error类 4.exception类 5.exception类中的unchecked exception 举例: 6.常用异常处理方法 a.tr ...
- mysql添加删除索引,查看某个表的建表语句
查看某个表的建表语句 :show create table data_statdata; drop index ts on data_statdata; 索引是加速查询的主要手段,特别对于涉及多个表的 ...
- 一个简单的QQ隐藏图生成算法 通过jQuery和C#分别实现对.NET Core Web Api的访问以及文件上传
一个简单的QQ隐藏图生成算法 隐藏图不是什么新鲜的东西,具体表现在大部分社交软件中,预览图看到的是一张图,而点开后看到的又是另一张图.虽然很早就看到过这类图片,但是一直没有仔细研究过它的原理,今天 ...
- CAS原子操作实现无锁及性能分析
CAS原子操作实现无锁及性能分析 Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn.net/chen19870707 ...