前言

差点一套把我直接送走
60+0+0+40=100…


Problem 1 数列问题

题目描述
小明和小红在一起玩游戏,小明觉得现在玩的游戏太无聊了,便给小红出了一道数列问题。数列问题的题目如下:

一开始,小明给小红一个只含有数字1的数列,接下来,小红可以对这个数列进行以下操作中的一种操作:

· 对序列中已有的一个元素加1.

· 复制一个序列中已有的元素到序列的末尾.
比如:一开始序列中只有一个元素[1]

我们可以选择这个序列中的第一个元素进行第二种操作,即复制操作,这样,这个序列就变成了[1,1]

然后,我们可以对这个序列中的第一个元素进行第一种操作,即将第一个元素进行+1.这样,这个序列就变成了[2,1]

现在,小明问小红,她最少需要进行多少次操作,可以使得序列中所有元素的和至少为n。

小红面对小明的这个问题一脸懵逼,于是,她来求助聪明的你,希望你能够帮助她解决这个问题。

输入格式
第一行一个数字t,表示测试数据的组数。

接下来行,每行一个数字,表示序列所有元素和至少应该达到的数。

输出格式
对于每一个问题,回答一个数字,表示小红最少需要操作的次数。

样例
样例输入:
5
1
5
42
1337
1000000000
样例输出:
0
3
11
72
63244


手推数据,发现规律为:0,1,2,2,3,3,4,4,4,5,5,5,6,6,6,6,7,7,7,7…
Solution1:map暴力枚举处理每个循环节开始的数,再在查询时找1~1e9中的
数,第一个大于等于它的数的操纵数即为答案,O(1e9t),再用一个map映射原数的话O(63244t) TLE 60
Solution2:公式,我不会证,但能想到成次方增加最优

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int main()
{int t,n;scanf("%d",&t);while(t--){scanf("%d",&n);int k=0;for(int i=1;i<=n;i++){if(i*i>=n){k=i;break;}}if(k*(k-1)>=n){printf("%d\n",k*2-3);}else{printf("%d\n",2*k-2);}}return 0;
}

手推公式的题还是第一次考啊。。。


Problem 2 Teamwork

传送门
考试时没想到怎么处理两个组之间的数的所属,打了个假贪心,WA 0

Solution:设d[i]表示到i时能获得的最大价值,因为它所属的组最多从max(0,i-k+1)开始,min(n,i+k-1)结束,与其他元素无关,又因为i+k-1会被后面的数的前一部分统计到,所以只考虑前一部分

则dp[i]=max(dp[i],dp[j]+maxn*(i-j))
其中 (上一组最后一个)i-k<=j<=i-1
maxn表示组内最大值,用RMQ优化

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int maxn,n,k,a[10005],dp[10005],f[100005][20];
void ST_chushi()
{for(int i=1;i<=n;i++){f[i][0]=a[i];}int t=(int)(log(n)/log(2))+1;for(int j=1;j<t;j++){for(int i=1;i<=n-(1<<j)+1;i++){f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);}}
}
int ST_search(int l,int r)
{int kk=log(r-l+1)/log(2);return max(f[l][kk],f[r-(1<<kk)+1][kk]);
}//RMQ部分
int main()
{scanf("%d%d",&n,&k);for(int i=1;i<=n;i++){scanf("%d",&a[i]);dp[i]=a[i];//初始价值为自己}ST_chushi();for(int i=1;i<=n;i++){for(int j=max(0,i-k);j<i;j++){maxn=ST_search(j+1,i);//O(1)得到最大值dp[i]=max(dp[i],dp[j]+maxn*(i-j));}}printf("%d\n",dp[n]);return 0;
}

因为如果当前元素包含在下一组里面,由于i-k要小于当前元素,所以更新的值是j还没有被算作上一组的时候,所以更新不会出错


Problem 3 飞行路线

传送门
瞟了一眼题面,呵呵,不是和架设电话线重题吗
打完之后看到至少直接懵逼
可恶啊啊啊虽然不读漏还是不会
Solution:分层图最短路
那么分层图是什么呢,我认为大概长这样:

设dp[i][j]表示到i时用j次机会的最少花费(到了第j层图),vis[i][j]表示到i时用j次机会是否出现过,那么我们有如下两种选择
1.花费一次机会,到达下一个点不花钱
2.花钱到达下一个点
而如果vis[i][j]=1了,就不用往下找了,因为肯定小于等于最优解(dijkstra的贪心策略)
然后就没有了

#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int n,k,m,st,sd,cnt,ans=0x3f3f3f3f,head[100005],dp[100005][11];
bool vis[100005][11];
struct ren{int next,to,dis;
}a[200005];
void add(int x,int y,int w)
{a[++cnt].to=y;a[cnt].next=head[x];head[x]=cnt;a[cnt].dis=w;
}
struct qren{int u,val,used;qren(){};qren(int U,int Val,int Used){u=U;val=Val;used=Used;}bool operator<(const qren &a)const{return val>a.val; }
};
priority_queue<qren> q;
void dijkstra()
{memset(dp,0x3f,sizeof(dp));dp[st][0]=0;q.push((qren){st,0,0});while(!q.empty()){int u=q.top().u,now=q.top().used;q.pop();if(vis[u][now]){continue;}vis[u][now]=1;for(int i=head[u];i;i=a[i].next){int v=a[i].to,w=a[i].dis;if(!vis[v][now+1]&&dp[v][now+1]>dp[u][now]&&now<k)//至多免费k条边(到第k层图){dp[v][now+1]=dp[u][now];//不花钱q.push((qren){v,dp[v][now+1],now+1});}if(!vis[v][now]&&dp[v][now]>dp[u][now]+w){dp[v][now]=dp[u][now]+w;//不使用免费机会,花钱q.push((qren){v,dp[v][now],now});}}}
}
int main()
{scanf("%d%d%d",&n,&m,&k);scanf("%d%d",&st,&sd);st++;sd++;for(int i=1;i<=m;i++){int x,y,w;scanf("%d%d%d",&x,&y,&w);x++;y++;add(x,y,w);add(y,x,w);}dijkstra();for(int i=0;i<=k;i++){ans=min(ans,dp[sd][i]);//每种花费的情况都要考虑(遍历每层图的结果)}printf("%d\n",ans);return 0;
}

动规+最短路确实挺巧妙的


Problem 4 公路修建问题

传送门
居然没看出来两次最小生成树。。。
很裸的一道题,因为第一次找一级公路为最优,都是从小到大排序,因为答案由最大的决定,所以两样都往小取就是最优解

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,k,ans,cnt,fa[9000005];
bool vis[9000005];
struct ren{int u,v,c1,c2,id;
}a[9000005];
bool cmp(ren x,ren y)
{return x.c1<y.c1;
}//求一级公路
bool pmc(ren x,ren y)
{return x.c2<y.c2;
}//二级公路
int Find(int a)
{if(a==fa[a]){return a;}return fa[a]=Find(fa[a]);
}
int main()
{scanf("%d%d%d",&n,&k,&m);m-=1;for(int i=1;i<=n;i++){fa[i]=i;}for(int i=1;i<=m;i++){scanf("%d%d%d%d",&a[i].u,&a[i].v,&a[i].c1,&a[i].c2);a[i].id=i;}sort(a+1,a+1+m,cmp);for(int i=1;i<=m;i++){int u=a[i].u,v=a[i].v;int fx=Find(u),fy=Find(v);if(fx==fy){continue;}ans=max(ans,a[i].c1);fa[fx]=fy;vis[a[i].id]=1;cnt++;if(cnt==k){break;}}//kruscalsort(a+1,a+1+m,pmc);for(int i=1;i<=m;i++){if(vis[a[i].id]){continue;}//第一次已经连上了就不用再造二级公路了int u=a[i].u,v=a[i].v;int fx=Find(u),fy=Find(v);if(fx==fy){continue;}ans=max(ans,a[i].c2);fa[fy]=fx;cnt++;if(cnt == n-1){break;}}printf("%d\n",ans);return 0;
}

每一次太阳的下落,都是为下一次黎明作序

国庆测试-one Problems Explanation相关推荐

  1. fckeditor2.63 上传图片的一个问题的解决办法

    fckeditor2.63 上传图片的一个问题的解决办法: 问题描述: 图片上传成功,但滚动条还处于滚动状态,也没有弹出"上传成功"的消息(本地测试no problems,uplo ...

  2. lm opencv 算法_Levenberg–Marquardt算法学习(和matlab的LM算法对比)

    回顾高斯牛顿算法,引入LM算法 惩罚因子的计算(迭代步子的计算) 完整的算法流程及代码样例 1.      回顾高斯牛顿,引入LM算法 根据之前的博文:Gauss-Newton算法学习 假设我们研究如 ...

  3. php ldap 登陆验证,LDAP用户验证功能简介

    LDAP功能是依赖于PHP的LDAP扩展,所以要加载LDAP扩展, 具体可以参考 安装PHP的LDAP扩展 一.功能简介 通过配置LDAP,实现ldap服务器的用户自动登录.也可以从ldap导入用户. ...

  4. JAVA处理Excel的三种实现方式(二)

    awm96 2012-05-15 13:49 createExcel(excel6); //modifyExcel(excel2); } static void readExcel(String fi ...

  5. Levenberg–Marquardt算法学习

    本次是对Levenberg–Marquardt的学习总结,是为之后看懂sparse bundle ajdustment打基础.这篇笔记包含如下内容: 回顾高斯牛顿算法,引入LM算法 惩罚因子的计算(迭 ...

  6. 基于Java实现的Lex词法分析器

    资源下载地址:https://download.csdn.net/download/sheziqiong/86918822 资源下载地址:https://download.csdn.net/downl ...

  7. ldap 单点登录 php,LDAP用户验证功能简介

    LDAP功能是依赖于PHP的LDAP扩展,所以要加载LDAP扩展, 具体可以参考 安装PHP的LDAP扩展 一.功能简介 通过配置LDAP,实现ldap服务器的用户自动登录.也可以从ldap导入用户. ...

  8. fabric测试网络启动警告解决:Local fabric binaries and docker images are out of sync. This may cause problems.

    警告信息: Local fabric binaries and docker images are out of sync. This may cause problems. Local fabric ...

  9. 国庆连夜测试羊了个羊,发现了一些游戏Bug

    Hi,大家好,最近都被羊了个游戏给洗脑了,一经上手,国庆放假都根本停不下来!要说啊,主要还是激起了我那该死的胜负欲! 微博霸榜.知乎热榜,各大社区无不在讨论个小游戏,甚至就连羊了个羊的官方服务器都崩溃 ...

最新文章

  1. java内存模型-JMM
  2. 重磅!Facebook公布PyTorch 1.0预览版!
  3. 左右两个下拉列表框的选项互移及获值效果
  4. drozer与adb工具的安装与使用
  5. c语言报告程序分析报告,2012C语言程序分析报告.doc
  6. git ssh创建分支_【ssh简单版git-server 1】自建git-server
  7. 算法题解:旋转数组的最小数字
  8. 在keil uVision 2/uVision 3下使用伟福系列仿真器的方法:
  9. 第1次在Flash Builder中写程序
  10. 课节5:图神经网络算法(二):GraphSage实践
  11. Jmeter怎么连接数据库
  12. matlab汽车牌的识别,matlab车牌号识别
  13. 《影响力》读书总结(一):影响力的武器
  14. 《21世纪的书:信息时代商业思想10×10阅读》書目信息
  15. JavaScript根据开始时间和结束时间计算具体礼拜几
  16. Xrm.Page.data.entity Properties and Methods
  17. 蓝桥杯嵌入式国赛 ---- TRDO TRAO 光敏电阻
  18. C语言中字符型(char)的简单使用
  19. 使用代理爬去微信公众号_手游推广,手游折扣代理,微信视频号这个引流方式的使用...
  20. android nfc settimeout,微信小程序API NFC·NfcA标签

热门文章

  1. 6年手工测试拿8.5k,我要学习自动化测试吗?
  2. 恶魔语言java_说地道的Java语言(译)
  3. 土地出让金骤降是“危”还是“机”?
  4. Python: 字符串与字节流的两种转换方式
  5. 【allegro 17.4软件操作保姆级教程五】布线前准备之过孔、差分对、布线集合添加
  6. awk命令详解(一)
  7. QT + VS2017 添加资源文件
  8. stm8s 定时器1 延时_STM8S_库函数_定时器自动装载TIM1
  9. 微软确认:这款浏览器将彻底再见!新款浏览器将于下月正式上线
  10. 申请专利需要什么流程?