清北刷题冲刺 11-02 p.m
函数最值

#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 100010
using namespace std;
int n;
long long a[maxn],ans,sum[maxn];
char s[maxn];
long long qread(){
int i=,j=;
char ch=getchar();
while(ch<''||ch>''){if(ch=='-')j=-;ch=getchar();}
while(ch<=''&&ch>='')i=i*+ch-'',ch=getchar();
return i*j;
}
int main(){
freopen("maximum.in","r",stdin);freopen("maximum.out","w",stdout);
// freopen("Cola.txt","r",stdin);
scanf("%d",&n);
for(int i=;i<=n;i++){
a[i]=qread();
sum[i]=sum[i-];
if(a[i]>)sum[i]=sum[i-]+a[i];
}
scanf("%s",s+);
long long c=;
for(int i=n;i>=;i--)//枚举从哪一位开始
if(s[i]==''){
ans=max(ans,c+sum[i-]);
c+=max(a[i],0LL);
}
ans=max(ans,c);
cout<<ans;
}
100分 贪心
函数最值2

#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1010
using namespace std;
int n,k,a[maxn],pla[],cnt,b[maxn];
long long ans=;
int count(int x){
int res=;
while(x){
if(x&)res++;
x>>=;
}
return res;
}
bool pos[maxn];
long long Abs(long long x){
if(x>=)return x;
if(x<)return -x;
}
int main(){
freopen("minimum.in","r",stdin);freopen("minimum.out","w",stdout);
// freopen("Cola.txt","r",stdin);
scanf("%d%d",&n,&k);
for(int i=;i<(<<n);i++)
if(count(i)==k)pla[++cnt]=i;
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=;i<=cnt;i++){
memset(pos,,sizeof(pos));
int p=;
int now=pla[i];
while(now){
p++;
if(now&)pos[p]=;
now>>=;
}
for(int j=;j<=n;j++){
if(pos[j]==||j==)b[j]=a[j];
else b[j]=b[j-];
}
long long sum=;
for(int j=;j<=n;j++){
sum=max(sum,Abs(b[j]-b[j-]));
}
ans=min(ans,sum);
}
cout<<ans;
}
20分 暴力
/*
二分两个数之间的差的最大值
F[i]表示i不改变的最小修改的元素个数
f[i]=min(f[j]+(i-j-1),i-1) abs(A[j]-A[i])<二分出来的答案*(i-j)
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#define maxn 2010
using namespace std;
int n,k,a[maxn],f[maxn];
bool check(int x){
f[]=;
int ans=n;
for(int i=;i<=n;i++){
f[i]=i-;
for(int j=;j<i;j++)
if(abs(a[i]-a[j])<=1LL*x*(i-j))
f[i]=min(f[i],f[j]+(i-j-));//假设改了(j~i)的数
ans=min(ans,f[i]+n-i);//假设最后一个数改了
}
return ans<=k;
}
int main(){
freopen("minimum10.in","r",stdin);
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
int l=,r=,ans=;
while(l<=r){
int mid=(l+r)>>;
if(check(mid))ans=mid,r=mid-;
else l=mid+;
}
printf("%d",ans);
return ;
}
100分 二分+dp
序列

#include<iostream>
#include<cstring>
#include<cstdio>
#define maxn 100010
using namespace std;
int n,X,Y,sum[maxn];
bool ok[][];
char s[maxn];
int Gcd(int x,int y){
if(y==)return x;
return Gcd(y,x%y);
}
int main(){
freopen("sequence.in","r",stdin);freopen("sequence.out","w",stdout);
// freopen("Cola.txt","r",stdin);
scanf("%d%d%d",&n,&X,&Y);
scanf("%s",s+);
for(int i=;i<=n;i++){
sum[i]=sum[i-];
if(s[i]=='A')sum[i]=sum[i-]+;
}
for(int len=;len<=n;len++){//枚举长度
for(int l=;l+len-<=n;l++){
int r=l+len-;
int cntA=sum[r]-sum[l-];
int cntB=len-cntA;
int g=Gcd(cntA,cntB);
cntA/=g;cntB/=g;
if(cntA==X&&cntB==Y)ok[l][r]=;
}
}
int q;
scanf("%d",&q);
int l,r,ans;
while(q--){
scanf("%d%d",&l,&r);
bool flag=;
for(int len=r-l+;len>=;len--){
for(int i=l;i+len-<=r;i++){
int j=i+len-;
if(ok[i][j]){
ans=len;
flag=;
break;
}
}
if(flag)break;
}
printf("%d\n",ans);
}
}
25分 暴力
预计得分100++
实际得分100++
T1写了一个小时的数位dp,然后调不出来了,发现可以贪心,就写了贪心。T2T3看了没什么思路,T2前30分可以状压,T330分貌似爆搜就能过,可能代码写的丑
今天的暴力分都得的不全,希望能把暴力写的优美一点
小结
清北刷题冲刺 11-02 p.m的更多相关文章
- 清北刷题冲刺 11-03 a.m
纸牌 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> ...
- 2017-10-2 清北刷题冲刺班a.m
一道图论神题 (god) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只 ...
- 2017-10-2 清北刷题冲刺班p.m
最大值 (max) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有一本书,上面有很多有趣的OI问题.今天LYK看到了这么一道题目: 这里有一个长度为n ...
- 清北刷题冲刺 11-02 a.m
卖书 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> ...
- 清北刷题冲刺 11-01 p.m
轮换 #include<iostream> #include<cstdio> #include<cstring> #define maxn 1010 using n ...
- 清北刷题冲刺 10-31 a.m
集合 #include<iostream> #include<cstdio> #include<algorithm> using namespace std; ], ...
- 清北刷题冲刺 10-30 a.m
星空 #include<iostream> #include<cstdio> using namespace std; int n,m; int main(){ freopen ...
- 清北刷题冲刺 10-29 p.m
洗澡 /* 这个题不能单纯判断左括号和右括号的多少,而应该从左到右扫一遍,看应该如何配对 */ #include<iostream> #include<cstdio> #inc ...
- 清北刷题冲刺 10-28 p.m
水题(贪心) (water) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK出了道水题. 这个水题是这样的:有两副牌,每副牌都有n张. 对于第一副牌的每 ...
- 清北刷题冲刺 10-28 a.m
立方数 (cubic) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方 ...
随机推荐
- Visual C++中min()和max()函数的使用
标准库在<algorithm>头中定义了两个模板函数std::min() 和 std::max().通常用它可以计算某个值对的最小值和最大值. 可惜在 Visual C++ 无法使用它们, ...
- WCF寄宿(Host)之自我寄宿(Self-Hosting)简单实例【Windows应用程序宿主】
前言: 以各种应用程序做自我寄宿的宿主原理方法大同小异,故:这儿直接上案例! 步骤一:创建服务契约和服务 1.新建解决方案:添加WCF服务库项目. 2.为了演示,我把自动生成的接口以及实现接口的类删 ...
- alt+shift+j 自动添加类的文档注释 Myeclipse
alt+shift+j 自动添加类的文档注释 Myeclipse ctrl+shift+y 将选中的内容大写换成小写 +x是转换成大写
- bzoj 1711 Dining吃饭 —— 最大流
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1711 食物一列,牛拆点,饮料一列. 代码如下: #include<cstdio> ...
- poj 2390 Bank Interest(计算本利和)
一.Description Farmer John made a profit last year! He would like to invest it well but wonders how m ...
- HDU1257(简单DP)
最少拦截系统 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- java"=="与equals()方法的对照
总结:String s=new String(); s是在堆内存里的 String s2=new String(); s2是在堆内存又重新生成的一个. package com.da; //逆向思维:i ...
- stm32之UCOS-III
一.UCOS-III 学习UCOS-III,一般会学习以下内容: 任务创建.删除.挂起.恢复等: 临界区:独占CPU,尽量少用,否则会降低效率: 时间管理:时钟节拍(基于硬件定时器).软件定时器: 互 ...
- Jenkins搭建Nodejs自动化测试
一.安装Jenkins(Windows) 1. 在Jenkins官网(https://jenkins.io/)下载安装包,解压并安装 2. 安装完成后,会自动打开一个页面,根据提示在安装目录下找到随机 ...
- JasperReports项目中的应用
转自:http://www.blogjava.net/vjame/archive/2013/10/12/404908.html . 2.业务处理 //返回报表查询结果 List<ReportEl ...