【伪题解】 [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场一(队)对一(队)的比赛. 为了让参赛队员能得到充分的休息,联赛组委会决定:每支队伍连续两场比赛之间至少间隔一天.也就是如 ...
随机推荐
- 在ScrollView添加一个ListView造成的滚动问题的简单解决办法()
正常来说,在ScrollView添加一个ListView后在真机上只会显示ListView的一行多一点,我也不理解为什么会这样,后来我把ListView的layout_height改成400dip,而 ...
- fmt 包中的函数和方法
/ Fprintf 将参数列表 a 填写到格式字符串 format 的占位符中// 并将填写后的结果写入 w 中,返回写入的字节数func Fprintf(w io.Writer, format st ...
- Idea其他设置
一.生成javadoc Tools->Gerenate JavaDoc 1. 选择是整个项目还是模块还是单个文件 2. 文档输出路径 3. Locale 选择地区,这个决定了文档的语言,中文就是 ...
- java消息队列怎么用
消息队列的使用场景是怎样的? 经常听到诸如rebbitmq,activemq,请教一下各位前辈消息队列的使用场景是怎样的,什么时候会用到它 校验用户名等信息,如果没问题会在数据库中添加一个用户记录 ...
- 汉澳sinox通过ndis执行windows驱动程序
汉澳sinox不仅能通过wine执行windows应用程序.还能通过ndis执行windows驱动程序 汉澳sinox使用 Windows NDIS 驱动程序 详细实现方法是用ndisgen把wind ...
- SolidEdge如何自动标注尺寸
1 工具-尺寸-关系助手(必须在编辑草图轮廓状态下,如果你的草图不可编辑,则没有这些选项) 2 框选要自动标注尺寸的东西,这些东西立即变为黄色,然后打对勾 3 选择横纵坐标尺寸原点(其实就是为 ...
- Androidproject文件下assets目录与res目录的差别
1. assets : 不会在R.java文件下生成对应的标记,assets目录能够自己创建目录,必须使用AssetsManager类进行訪问,存放到这里的资源在执行打包的时候都会打入程序安装包中, ...
- 《Java虚拟机原理图解》4.JVM机器指令集
0. 前言 Java虚拟机和真实的计算机一样,执行的都是二进制的机器码:而我们将.java 源码编译成.class 文件,class文件便是Java虚拟机可以认识的二进制机器码,Java可以识别cla ...
- u-boot简单学习笔记(二)——AR9331 uboot.lds分析
最开始系统上电后 从uboot.lds开始引导 OUTPUT_FORMAT("elf32-tradbigmips", "elf32-tradbigmips", ...
- UnsatisfiedLinkError: No implementation found for , AndroidStudio使用*.so
今天工作的时候.发现了一个jni的问题,java.lang.UnsatisfiedLinkError: No implementation found for...... 问题1:后来查了资料后发现. ...