传送门

D题

题意:波浪数组满足四个条件:1、至少两个元素。2、奇数位的数都相等。3、偶数位的数都相等。4、奇数位和偶数位的数不相等。给你一个数组(数组中元素不大于c),你要从中找出波浪数组的最大长度。(保证波浪数组是该数组的一部分就行,就是可以在数组中任意按顺序挑选,使之满足波浪数组的条件)

这个题可以用动态规划(dp)来解。首先了解一下什么是dp。

  • 将一个复杂的问题分解成若干个子问题,通过综合子问题的最优解来得到原问题的最优解
  • 动态规划会将每个求解过的子问题的解记录下来,这样下一次碰到同样的子问题时,就可以直接使用之前记录的结果,而不是重复计算
  • 可以用递归或者递推的写法实现,递归的写法又叫记忆化搜索
  • 重叠子问题:如果一个问题可以被分解成若干个子问题,且这些子问题会重复出现,就称这个问题拥有重叠子问题。 一个问题必须拥有重叠子问题,才能用动态规划去解决。

首先我们来构造一个波浪数组,比如:1 2 1 2 1 2 1 2

很容易就发现当奇数位是1,偶数位是2的时候,波浪数组的排列一定是1后面是2,2后面是1,再1后面是2,2后面是1...

于是子问题就成了,当1出现的时候我们去找后面的2,并且ans++,当2出现的时候我们去找1,ans++...(因为分开来看,你找的只是波浪数组中的奇数位和偶数位的数字而已)

那么,如何来记录1 2 1 2 1 2 1 2这样的数组呢?

可以用一个二维数组巧妙地利用这两个相关的数组来记录他们出现的次数。

因为i的后面一定是j,j的后面一定是i.故dp[i][j]=dp[j][i]+1,dp[j][i]=dp[i][j]+1.这个计数方式妙处在于dp[i][j]中i是目前正在遍历的数字,而j是添加的后缀用来辨认下一个j来计数的。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <vector>using namespace std;typedef long long ll;
const int maxn=1e5+7;int a[maxn];
int dp[105][105];int main()
{freopen("input.txt","r",stdin);int n,c;cin>>n>>c;for(int i=0;i<n;i++) cin>>a[i];int maxlen=0;for(int i=0;i<n;i++)//所有元素 {for(int j=1;j<c;j++)//从1到c遍历 {dp[a[i]][j]=dp[j][a[i]]+1;if(a[i]==j) continue;maxlen=max(maxlen,dp[a[i]][j]);}}cout<<maxlen<<endl;return 0;
}

F题

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <cstdio>using namespace std;typedef long long ll;const int maxn=1e4+10;int a[maxn],b[maxn],dis[maxn],vis[maxn];int main()
{int len;while(cin>>len){string s;cin>>s;int al=0,vl=0,il=0,nl=0;for(int i=0;i<len;i++){if(s[i]=='a') al++;if(s[i]=='v') vl++;if(s[i]=='i') il++;if(s[i]=='n') nl++;}int num=al*vl*il*nl;int den=len*len*len*len;int yue=__gcd(num,den);cout<<num/yue<<"/"<<den/yue<<endl;}return 0;
}

G题

做不出这道题的童鞋相信都卡在了这个坑里。

all the cars running in the north-south direction wait the same amount of integral time so that no two cars bump.

去掉定语后是:all the cars wait the same time. 所有汽车等待时间相同。

这句话的意思是:所有南北方向上的汽车要等待相同的时间,以至于没有两辆汽车相撞。

这句话的关键是所有汽车等待时间相同,要么全都是5min,要么全都是10min,不能这辆汽车等1min、那辆汽车等2min的。

暴力枚举即可。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <cstdio>using namespace std;typedef long long ll;const int maxn=1e4+10;int a[maxn],b[maxn],dis[maxn];int main()
{   int n,m;while(cin>>n>>m){memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(dis,0,sizeof(dis));for(int i=0;i<n;i++) {cin>>a[i];dis[a[i]]=1;}for(int i=0;i<m;i++) cin>>b[i];int ans;for(int i=0;i<1001;i++){int flag=0;for(int j=0;j<m;j++){if(dis[b[j]+i]){flag=1;break;}}if(!flag){ans=i;break;}}cout<<ans<<endl;}return 0;
}

H题

题解:

题意:

给你一段区间1-n,可以从这个这个区间里找到一个点,记为r,从1-r找到一个点,记为l,问通过这个方法找任意两个区间的概率。

解答:

求算相交的概率,就是求算1减去不相交的概率,因为相交的概率并不好求,所以可以先转化一下角度。

根据古典概型理论,全部的情况为n*n

不相交的所有情况就是左区间的右端点小于右区间的左端点的所有位置,即等差数列n*(n-1)/2;

所以所求概率为1 -  ((n*(n-1)) / 2 / n*n);
题目要求答案是p/q(mod 1e9+7)

因为运算要进行取模,所以除法要变成乘以其逆元,求逆元可以用费马小定理,a的逆元为a^(mod-2).

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <cstdio>using namespace std;typedef long long ll;const ll mod=1e9+7;ll ksm(ll a,ll n)
{ll res=1;while(n){if(n&1) res=res*a%mod;a=a*a%mod;n>>=1;}return res;
}int main()
{ll n;while(cin>>n){cout<<(n+1)*ksm(n*2,mod-2)%mod<<endl;}return 0;
}

I题

题意概括:给你n个数(小数点后面保留三位),现在要把这些三位数全都四舍五入变成两位数。问这些数变成两位全都变成两位数之后,与改变位数之前的差值是多少。

解题思路:字符串输入,用str表示字符串的最后一位、ans统计每个数与改变位数之前的差值的1000倍,即小数点后面的第三位。如果str变成数字后小于5,说明四舍五入后会丢失这个数ans-=(str-'0').如果str变成数字后大于等于5,说明四舍五入后ans增加(10-(str-'0')).输出的时候ans再除以1000.

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <cstdio>using namespace std;typedef long long ll;const int maxn=1e4+10;int main()
{int n;while(cin>>n){int ans=0;for(int i=0;i<n;i++){string s;cin>>s;int len=s.length();char str=s[len-1];if((str-'0')<5) ans-=(str-'0');else ans+=(10-(str-'0'));}if(ans<0) cout<<"-";ans=abs(ans);float y=ans/1000.0;printf("%.3f\n",y);}return 0;
}

J题

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <cstdio>using namespace std;const int maxn=1e4+10;
typedef long long ll;int a[maxn];ll gcm(ll a,ll b)
{ll ans=__gcd(a,b);ans=a*b/ans;return ans;
}int main()
{ll n,m;while(cin>>n>>m){for(int i=0;i<n;i++) cin>>a[i];ll temp=1;for(int i=0;i<n;i++){temp=gcm(a[i],temp);}ll temp2=0;for(int i=0;i<n;i++) temp2+=(temp/a[i]);if(m%temp2==0) {cout<<"Yes"<<endl;ll c=m/temp2;cout<<temp/a[0]*c;for(int i=1;i<n;i++) cout<<" "<<temp/a[i]*c;cout<<endl;}else cout<<"No"<<endl;}return 0;
}

K题

没想到竟然PE了,少输换行符竟然还会错,还是养成输换行符的习惯吧。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <cstdio>using namespace std;typedef long long ll;int main()
{int x,y;cin>>x>>y;int num=(x+y)/2;printf("%d\n",num*(num-y));return 0;
}

HPU 18级个人训练 11月15日相关推荐

  1. 互联网晚报 | 11月14日 星期日 | 好未来宣布关闭K9学科类业务;京东工业品推出“智能移动仓”;北交所11月15日正式开市...

    ‍ 今日看点 ✦ 好未来:义务教育阶段的学科类校外培训服务将于12月31日截止 ✦ 天猫双11菜鸟物流绿色减碳1.8万吨,120万人参与快递箱回收 ✦ 京东工业品推出"智能移动仓" ...

  2. Tether销毁5亿USDT;BCH将于11月15日硬分叉,SV-Pool已向普通矿工开放

    注1:CBT20是指24小时内市值排名前20的数字货币. 注2:图2是数字货币市场总市值在24小时内的走势变化,该走势反应了当前大盘的总体表现情况. 注3:图中数据来源于coinmarketcap. ...

  3. 方舟服务器自动维护,方舟生存进化11月15日转服系统维护服务器驯服调整

    方舟生存进化将于11月15日对转服系统进行维护,所有转服门票需在11月15日维护前使用掉,维护完成后,之前已购买的转服门票将会自动销毁: 以下维护修改仅限联机服务器,单机不受影响: 官方将于11月13 ...

  4. 11月15日BCH协议升级提案又双叒啜来了,请查收!

    ​​BCH告别了5月的纷扰,迎来了新的篇章.对于BCH来说,一年中有两件大事,一是5月15日的升级,二是11月15日的升级.上半年的网络升级已经顺利完成并告一段落,下半年的升级工作正在被BCH开发者写 ...

  5. 北交所开市工作准备就绪 定于2021年11月15日开市

    11月12日消息,北交所发布公告称,目前,北交所开市各项工作已准备就绪,定于2021年11月15日开市. 2021年11月12日,北交所发布<北京证券交易所合格境外机构投资者和人民币合格境外机构 ...

  6. 【历史上的今天】11 月 15 日:全球首款商用微处理器;微软进军游戏界;ICQ 诞生

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2021 年 11 月 15 日,在 1982 年的今天,我国第一家婚姻介绍所成立:在 80 年代初," ...

  7. 2014年11月15日SIE赛意公司面试

    2014年11月15日SIE赛意公司面试 昨晚收到SIE(赛意)公司的面试通知,群面+单面共2个小时,今天中午就屁颠屁颠得跑到体育中心了.话休烦絮,直接进入正题. 1点半的面试,到公司门口已经1点15 ...

  8. 时空召唤今天服务器维护吗,时空召唤11月15日维护更新预告 全新地图全面开放...

    时空召唤为让玩家们更好的游戏体验将于11月15日更新全新版本,届时将上线全新地图.龙灵传说皮肤等,下面就跟小编一起来了解更多更新内容吧! 阅读推荐:时空召唤新英雄魔术师乔克即将来袭 新皮肤降临 预告内 ...

  9. 长城证券:信达证券、天弘基金等2家机构于11月15日调研我司

    2021年11月29日长城证券(002939)发布公告称:信达证券王舫朝 王锐.天弘基金孙高睿于2021年11月15日调研我司. 本次调研主要内容: 问:财富管理业务的组织架构是怎样的? 答:财富管理 ...

最新文章

  1. 元旦福利 | Python、机器学习、TensorFlow 图书送一波
  2. 订单BOM与销售BOM的区别
  3. Cloud for Customer的前台请求是怎么发送到后台的
  4. 用一个实际例子理解Docker volume工作原理 1
  5. 浅析Entity Framework Core中的并发处理
  6. servlet实现登陆注册
  7. SQL Server 2012 自动增长列,值跳跃问题
  8. Tempo超进化,提效降本好帮手,工时管理小当家 Timewise
  9. shell下office、html、pdf文档互转方法
  10. MATLAB 自然数e的表达式坑、如何求解含有未知量的行列式
  11. 前端工作第一天,准备事项,配置环境
  12. leetcode189 python旋转数组
  13. JAVA大数据需要学什么
  14. Fiddler教程系列—介绍【必看】
  15. ERROR CODE: 0xC004F069 解决办法
  16. Markdown的使用之一:表格和公式
  17. 从Redis+Lua到Goroutine,日均10亿次的股票行情计算实践
  18. windbg 脚本命令
  19. 谷歌地球飞行模式使用教程
  20. 贝叶斯滤波算法(实例)

热门文章

  1. LiquiBase 使用
  2. 版本号的写法及其对应含义
  3. 关于原码与IEEE754的阶码
  4. DeepFaceLab-AI换脸炼丹实战
  5. 抖音自动生成视频、字幕、自动上传发布
  6. oppo锁频段_OPPO 5G CPE Omni发布:支持世界所有5G和4G频段
  7. UPS电源的电话语音监控方式,让机房没有信号也能监控UPS
  8. 华为荣耀 v9报了个很奇怪得错误
  9. 如何提高英语口语水平
  10. 朴实的聊聊很多人会误解/不懂的Java并发中断机制