NO.1

题目描述:
给定一个长度为N的序列a,对于每一个数都可选或不选,把选出的数有序组成一个新的序列b,使b序列的“和谐数”最大。
一个序列的和谐数如下定义:对于位置i,如果第奇数次选的则加上bi,偶数次选的则减去bi
注意:新的序列b必须是从左到右依次在a序列选择的,即不能打乱顺序。

思路:DP
设f[i,0/1]表示第i个位置选(为0)或不选(为1)的“和谐数”最大
状态转移方程为:
f[i,0]=max(f[i-1,0],f[i-1,1]+a[i])
f[i,1]=max(f[i-1,1],f[i-1,0]-a[i])
用了DP,妈妈再也不用担心我不会AC

代码:

uses math;
var n,i,x:longint;f:array[0..10000001,0..1]of int64;
beginassign(input,'a.in');assign(output,'a.out');reset(input);rewrite(output);readln(n);for i:=1 to n dobeginread(x);f[i,1]:=max(f[i-1,1],f[i-1,0]-x);f[i,0]:=max(f[i-1,0],f[i-1,1]+x);end;write(max(f[n,1],f[n,0]));close(input);close(output);
end.

NO.2

题目描述:
ProKing来到了家里,忽然发现桌台上有n1个玩偶,每个玩偶上有一个对应的值,而在桌台下也有n2个玩偶,每个玩偶上也有一个对应的值,现在,proking想知道台上的玩偶的默契值除以台下玩偶的默契值得到的既约分数(既约分数就是分子分母最大公约数为1的分数)
默契值定义为所有玩偶的权值的乘积.

20%思路:暴力
直接将两个序列乘起来,再用辗转相除法求最大公因数

60%思路:高精度
可以使用高精度,把两个序列两两去除公因数,时间复杂度O(n^2)

100%思路:高精度+筛素数+压位
先用zs[i]来存i的最小质因数
然后我们对每个序列开一个数组s[i,j]为第j序列拥有i质因数的个数,那么循环枚举a[i,j]的最小质因数(zs[a[i,j]),求出除完最小质数后的数(a[i,j]-a[i,j] div zs[a[i,j]]),再求除后的数的最小质因数……
到这里,我们求出了每个序列分解质因数后的每个质因数所拥有的质数,那么就去重!!!
去重分三种情况:
①s[i,1]>s[i,2](也就是第一个序列拥有i的数量比第二个序列多),那么s[i,1]-=s[i,2] s[i,2]=0
②s[i,2]>s[i,1](第一个序列拥有i的数量比第二个序列少),那么s[i,2]-=s[i,1] s[i,1]=0
③s[i,1]=s[i,2](第一个序列拥有i的数量等于第二个序列拥有i的数量),那么s[i,1]=s[i,2]=0
这样做完,两个序列就必须是互质的
然后,就用高精度乘法
因为只用高精度乘法,是会超时的,所以就要用压位
所谓压位,就是将原本存一位的a[i],改成存多位
那么压位很简单实现
还有一个细节,就是在压位输出时,一般会将首位的0省略不输,那么就要加一个处理,将0位补齐(Tips:第一位不用补0)

代码:

const max=2300;mo=100000000;
var n:array[1..2]of int64;a,s,l:array[0..100101,1..2]of int64;x,z,y:int64;i,j,k:longint;zs:array[0..12624]of int64;procedure zxs;
var i,x:longint;
beginfor i:=2 to 10000 dobeginx:=0;for j:=2 to trunc(sqrt(i)) doif (i mod j=0) thenbeginzs[i]:=j; x:=j;break;end;if x=0 then zs[i]:=i;end;
end;beginassign(input,'count.in');assign(output,'count.out');reset(input);rewrite(output);read(n[1]);for i:=1 to n[1] do read(a[i,1]);readln;read(n[2]);for i:=1 to n[2] do read(a[i,2]);zxs;for i:=1 to 2 dofor j:=1 to n[i] dobeginx:=a[j,i];while x>1 dobegininc(s[zs[x],i]);x:=x div zs[x];end;end;for i:=2 to 10000 doif (s[i,1]>0)and(s[i,2]>0) thenif (s[i,1]>s[i,2]) then begin s[i,1]:=s[i,1]-s[i,2]; s[i,2]:=0; endelse begin s[i,2]:=s[i,2]-s[i,1]; s[i,1]:=0; end;l[max,1]:=1; l[max,2]:=1;for i:=1 to 2 dofor j:=2 to 10000 dobeginz:=s[j,i];while z>0 dobegindec(z);for k:=2 to max do l[k,i]:=l[k,i]*j;for k:=max downto 2 doif l[k,i]>9 thenbeginl[k-1,i]:=l[k-1,i]+l[k,i] div mo;l[k,i]:=l[k,i] mod mo;end;end;end;x:=0;for i:=1 to 2 dobeginfor j:=0 to max doif l[j,i]>0 thenbeginx:=j;break;end;write(l[x,i]);for j:=x+1 to max dobeginy:=l[j,i]; z:=0;if y=0 then y:=1;while y<mo dobeginy:=y*10;z:=z+1;end;for k:=2 to z do write('0');write(l[j,i]);end;write(' ');end;close(input);close(output);
end.

NO.3

题目描述:
给定一个长度为n的序列a,试求出对于序列a的每一个前缀的终极数x,使得


最小,试求出终极数t(如若有多个终极数t,只需输出最小的那个)

思路:堆维护+快排
这题的主要思路就是就中位数
堆有两个堆一个是大根堆,一个是小根堆,其实小根堆的堆顶就是中位数
这个问题就转移为维护一个堆
维护一个堆有三种情况:
①将大根堆从大到小排序
②将小根堆从小到大排序
③如果,大根堆顶大于小根堆顶,就将大根堆顶和小根堆顶交换,交换后的大根堆和小根堆都要进行重新排序
那么每一次的小根堆顶就是x终极数
最后再快排终极数,求出中位数即可AC

代码:

#include<cstdio>
#include<iostream>
#include<cstdlib>
using namespace std;
int x1,x2,a[1000001]={0},big[1000001]={0},small[1000001],x[1000001],i,t,n;
void temp1(int x)
{while ((x>1)&&(small[x]<small[x/2])){t=small[x];small[x]=small[x/2];small[x/2]=t;x=x/2;}
}
void temp2(int x)
{while ((x>1)&&(big[x]>big[x/2])){t=big[x];big[x]=big[x/2];big[x/2]=t;x=x/2;}
}
void doit1(int x)
{int y;while (((x*2<=x1)&&(small[x*2]<small[x]))||(((x*2+1)<=x1)&&(small[x*2+1]<small[x]))){y=x*2;if ((x*2+1<=x1)&&small[x*2+1]<small[x*2]) y=x*2+1;t=small[y];small[y]=small[x];small[x]=t;x=y;}
}
void doit2(int x)
{int y;while (((x*2<=x2)&&(big[x*2]>big[x]))||(((x*2+1)<=x2)&&(big[x*2+1]>big[x]))){y=x*2;if (x*2+1<=x2&&big[x*2+1]>big[x*2]) y=x*2+1;t=big[y];big[y]=big[x];big[x]=t;x=y;}
}
void qsort(int l,int r)
{int i=l,j=r,mid=x[(l+r)/2];if (l>=r) return;do{while(x[i]<mid) i++;while(x[j]>mid) j--;if (i<=j){t=x[i];x[i]=x[j];x[j]=t;i++;j--;}}while (i<=j);qsort(l,j);qsort(i,r);
}
int main()
{freopen("c.in","r",stdin);freopen("c.out","w",stdout);scanf("%d",&n);x1=0;x2=0;for (int i=1;i<=n;i++) {scanf("%d",&a[i]);if (i%2==1){x1++;small[x1]=a[i];temp1(x1);if (small[1]<big[1]){t=small[1];small[1]=big[1];big[1]=t;doit1(1);doit2(1);} }else {x2++;big[x2]=a[i];temp2(x2);if (small[1]<big[1]){t=small[1];small[1]=big[1];big[1]=t;doit1(1);doit2(1);} }x[i]=small[1]; }qsort(1,n);printf("%d",x[n/2]);fclose(stdin);fclose(stdout);return 0;
}

NO.4

题目描述:给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等。

思路:前缀和+贪心
如果设遇’0’+1,遇’1’-1
那么如果在前后找到有相等的数值时,这两个中间的序列必定是符合的!(长度就是x[i]-x[j])
那么为了减少时间复杂度,就可以用贪心思想,记录出现这个数的最前和最后
循环一遍求出最长的长度

代码:

var s:ansistring;i,ans,j,min,max,x:longint;min1,max1:array[-1000001..1000001]of longint;
beginassign(input,'string.in');reset(input);assign(output,'string.out');rewrite(output);fillchar(min,sizeof(min1),127);min1[0]:=0;readln(s);min:=maxlongint;x:=0;max:=0;for i:=1 to length(s) doif s[i]='1' thenbegininc(x);if x>max then max:=x;if x<min then min:=x;if i<min1[x] then min1[x]:=i;if i>max1[x] then max1[x]:=i;endelsebegindec(x);if x>max then max:=x;if x<min then min:=x;if i<min1[x] then min1[x]:=i;if i>max1[x] then max1[x]:=i;end;for i:=min to max doif ans<max1[i]-min1[i] then ans:=max1[i]-min1[i];write(ans);close(input);close(output);
end.

2017.7.7 C组总结相关推荐

  1. 2017年新年问候-组内

    2016年转瞬即逝,2017悄然到来,新的一年,新的希望,新的目标,祝大家新快乐. 回首2016年,我们组成就颇多,先随便列几个: 1. 我们共完成63 个定制项目. 2. 我们处理了67个客诉流程. ...

  2. 当SQL Server爱上Linux:配置 SQL Server 2017 上的可用性组初体验

    作者 | 张乐奕:Oracle ACE 总监,ACOUG (中国 Oracle 用户组)联合发起人.Oracle 数据库高可用解决方案与  Exadata 一体机专家.长于数据库故障诊断,性能调优.作 ...

  3. 2017哈理工 低年级组院赛初赛 G-做游戏 【水题】

    题目描述 今天是Tabris和mengxiang000来到幼儿园的第9天. 为了庆祝这美好的一天,老师组织同学们做游戏,拿来了好多骰子. 游戏规则: 1)两个人每人轮流掷骰子,操控同一个小人在一个有向 ...

  4. 自古成功在尝试 jzoj 2017.8.21 B组

    第一题 [NOIP2011模拟7.29]铃仙·优昙华院·稻叶 (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Detailed ...

  5. 2017.6.4 入门组 NO.2——睡眠

    其实这题就是将第二个时间-第一个时间,小于0的补全就A了 代码如下: var x,y,k:string;l1,l2,x1,x2,x3,y1,y2,y3:longint; beginreadln(x); ...

  6. 蓝桥杯 2017 国赛B组C/C++【对局匹配】

    题意就是给我们一串数  让我们尽可能地取 约束条件是a[i] 和a[i]+k不能同时出现 所有元素之间相差k的元素都不能同时出现  让我们求所能取到的最大的数的和是多少 分析: dp思路,这个和树形d ...

  7. 2017.9.13 不等式组 思考记录

    深深感到数学差的悲哀.连分类讨论都讨论不全,而且会晕. 所以分类讨论: 分成 大于号和 小于号 两种情况讨论 如果a>0,一定是大于号 如果右边是大于0的小数,那一定是上取整 如果右边是大于0的 ...

  8. 蓝桥杯 2017年C语言组大学B组 C/C++

    1.标题: 购物单 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有 ...

  9. 2017蓝桥杯B组:最长公共子序列(动态规划详解(配图))

    最大公共子串长度问题就是: 求两个串的所有子串中能够匹配上的最大长度是多少. 比如:"abcdkkk" 和"baabcdadabc", 可以找到的最长的公共子串 ...

  10. 2017蓝桥杯B组:取数位(递归,求余和除法)

    五.题目:取数位 求1个整数的第k位数字有很多种方法. 以下的方法就是一种. 题目所给代码如下: // 求x用10进制表示时的数位长度 int len(int x){ if(x<10) retu ...

最新文章

  1. scrapy框架对接seleniumpipeline数据持久化
  2. 【NOIP普及组】2016模拟考试(10.29)——排座椅
  3. 经典算法刷题笔记pdf
  4. nyoj_111_分数加减法_201311281341
  5. CANOpen状态机
  6. mysql maria引擎_MySQL/MariaDB---查询缓存与存储引擎
  7. 从Postman到ApiPost——码农闰土
  8. 幽灵java进程引起的: FATAL ERROR in native method
  9. formatter function (value,row,index){} 参数的含义
  10. 网上出现反绿坝网站,邀请网友签名以抵制绿坝
  11. 基于vue的html编辑器,基于vue富文本编辑器的慢慢人生路
  12. #VMware ESXI7.0的下载
  13. 【GNSS发展历史】
  14. 今日头条号如何过原创
  15. Android学习计划
  16. Arduino上手动添加开发板
  17. 莫比乌斯函数和莫比乌斯反演
  18. 鸿蒙渊更新公告,《天下3》更新公告(版本2.0.706)
  19. 第131天:移动web页面的排版与布局
  20. Python实现淘宝秒杀

热门文章

  1. mysql 1032_MySQL数据库之MySQL 报错 Last_SQL_Errno: 1032
  2. 在tensorflow框架下添加正则化约束l1、l2的方法
  3. thinkadmin 内置小程序授权获取openid和生成小程序二维码的使用
  4. 未将对象引用设置到对象的实例 解决办法
  5. 怎么能跳过苹果服务器降级系统,苹果ios11手机怎样将系统降级?简单三步即可完成降级!...
  6. 刘彬20000词汇10
  7. 万能表单php设计思路,在线自定义万能表单的设计思路
  8. dom4j解析xml文件
  9. Android源码阅读工具AndroidXRef使用说明
  10. 玩个游戏好难 Win10我的世界(Minecraft)下载