博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【牛客Wannafly挑战赛12】 题解
阅读量:5047 次
发布时间:2019-06-12

本文共 2656 字,大约阅读时间需要 8 分钟。

https://www.nowcoder.com/acm/contest/79#question

说是比赛题解,其实我只会前三题;

后面的一定补

T1

题意,在一个长度为n的时间内,问如何选择存款期限,使得收益最大。

dp

#include 
#include
#include
#include
using namespace std;#define fi first#define se seconddouble r[5];double dp[30];double ll(int n,int id,double a){ double t=1.0; for(int i=1;i<=n;i++) { t=t*(1+r[id]); } return t*a;}int main(){ int n; scanf("%d%lf%lf%lf%lf",&n,&r[1],&r[2],&r[3],&r[4]); memset(dp,0,sizeof(dp)); dp[0]=1.0; for(int i=1;i<=n;i++) { for(int j=1;j<=4;j++) { int nian=(j==4)?5:j; if(i>=nian) { dp[i]=max(ll(nian,j,dp[i-nian]),dp[i]); } } } printf("%.5lf\n",dp[n]); return 0;}
View Code

 

T2

利用前缀和即可;

#include 
#include
#include
#include
#include
typedef long long ll;using namespace std;const int maxn = 1000009;ll a[maxn],b[maxn];ll n,m;bool cmp(ll a,ll b){ return a > b;}int main(){ scanf("%lld%lld",&n,&m); for(int i=1; i<=n; i++) { scanf("%lld",&a[i]); } for(int i=1;i<=n;i++) { scanf("%lld",&b[i]); } a[0]=0,b[0]=0; sort(a+1,a+1+n); sort(b+1,b+1+n,cmp); for(int i=1;i<=n;i++) { a[i]+=a[i-1]; b[i]+=b[i-1]; } ll ans = 0; ll ff=0; for(int i=1;i<=n; i++) { if(i%3==0) ff+=m; ll tmp = b[i]-a[i]+ff; if(tmp>ans)ans=tmp; } printf("%lld\n",ans); return 0;}
View Code

 

T3

题意:操作一个只含a,b的字符串,问能最少删去字母个数,使得在最后的字符串中,相邻不同的个数少于m个;

思路:dp;这题关键就是把(且新的字符串的首字母必须是'a')这句话发挥得淋漓尽致,这也规定了答案字符串中,必须是一块a,一块b,一块a……

所以,如果 j 是偶数,表示后面就要接a,如果 j 是奇数,必须要有b才行; 

#include 
#include
#include
#include
#include
#include
#define pb push_backtypedef long long ll;using namespace std;const int maxn = 1000009;ll dp[maxn][20];string s1;int n,m;int main(){ cin>>n>>m>>s1; s1="*"+s1; memset(dp,0,sizeof(dp)); int flag=1; for(int i=1; i<=n; i++) { for(int j=0; j<=m; j++) { dp[i][j]=max(dp[i][j],dp[i-1][j]); } for(int j=0; j<=m; j++) { if(((j&1)&&s1[i]=='b')||(((j&1)==0)&&s1[i]=='a')) { if(j!=0)dp[i][j]=max(dp[i][j], dp[i-1][j-1]+1); dp[i][j]=max(dp[i][j], dp[i-1][j]+1); } } if(s1[i]=='a')flag=0; //最后尽然把全b的情况忘记了 } ll ans = 0; for(int i=0; i<=m; i++) { ans=max(ans, dp[n][i]); } if(flag)cout<<0<
View Code

 

     

转载于:https://www.cnblogs.com/ckxkexing/p/8635483.html

你可能感兴趣的文章
WebService中的DataSet序列化使用
查看>>
BZOJ 1200 木梳
查看>>
【Linux】【C语言】菜鸟学习日志(一) 一步一步学习在Linxu下测试程序的运行时间...
查看>>
hostname
查看>>
SpringBoot使用其他的Servlet容器
查看>>
关于cookie存取中文乱码问题
查看>>
k8s架构
查看>>
select 向上弹起
查看>>
mysql 多表管理修改
查看>>
group by order by
查看>>
web开发不可少的RSS、CSS和HTML验证工具
查看>>
CloudStack API访问权限控制
查看>>
设计模式之Singleton模式
查看>>
【loj6029】「雅礼集训 2017 Day1」市场 线段树+均摊分析
查看>>
在Linux上下载和安装AAC音频编码器FAAC
查看>>
我们为什么在移动端项目中选择jQuery而不是Zepto
查看>>
如何自定义 maven中的archetype
查看>>
有趣的网站
查看>>
vue+django2.0.2-rest-framework 生鲜项目(四)
查看>>
Laravel-china社区学习
查看>>