今天,是一个重要的日子。

(想什么呢?我说的当然是那位大人的生日啦)

T1 题意简述:jzoj3223

Description

Input

Output

输出 q行,第 i行输出对于第 i个询问的答案。

Data Constraint

解题思路:出题人居然已经懒到用河北2013年的省选题当考题了...

而且重点是还把HEOI打成HBOI(湖北OI)了...

这道题怎么做不用我多说了吧。

正反各做一遍背包,二进制拆分优化即可。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
int n,k,ans,mon[1001],wei[1001],tim[1001];
int dp1[1001][1001],dp2[1001][1001];
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d%d%d",&mon[i],&wei[i],&tim[i]);for(int i=1;i<=n;i++){int lim=tim[i];for(int j=0;j<=1000;j++)dp1[i][j]=dp1[i-1][j];for(int j=1;lim;j=min(j<<1,lim)){for(int l=1000;l>=j*mon[i];l--)dp1[i][l]=max(dp1[i][l],dp1[i][l-j*mon[i]]+j*wei[i]);lim-=j;}}for(int i=n;i>=1;i--){int lim=tim[i];for(int j=1;j<=1000;j++)dp2[i][j]=dp2[i+1][j];for(int j=1;lim;j=min(j<<1,lim)){for(int l=1000;l>=j*mon[i];l--)dp2[i][l]=max(dp2[i][l],dp2[i][l-j*mon[i]]+j*wei[i]);lim-=j;}}scanf("%d",&k);for(int i=1;i<=k;i++){int u,v;scanf("%d%d",&u,&v);u++;ans=0;for(int j=0;j<=v;j++)ans=max(ans,dp1[u-1][j]+dp2[u+1][v-j]);printf("%d\n",ans);}return 0;
}


T2 题意简述:jzoj100029

Description

陪审团制度历来是司法研究中的一个热议话题,由于陪审团的成员组成会对案件最终的结果产生巨大的影响,诉讼双方往往围绕陪审团由哪些人组成这一议题激烈争夺。 小 W 提出了一个甲乙双方互相制衡的陪审团成员挑选方法:假设共有 n 名候选陪审团成员,则由甲先提名 s 位候选人,再由乙在甲提名的 s 位候选人中选出 t 名,作为最终的陪审团成员。显然这里应当有n ≥ s ≥ t。假设候选人 k 对甲、乙的有利程度都可以用一个二元组(??, ??)来表示,??越大说明候选人 k 对甲越有利,??越大则对乙越有利。在此前提下,双方的目标都变得明确:甲要最大化最终陪审团 t 人的 x 之和,最小化 y之和,乙则反之。 现在甲方决定聘请你为律师,并且事先得知了乙方律师的策略:乙方律师会在你提名的 s 名候选人中选出 t 名使得这 t 人的 y 值之和最大,再保证 y 值之和最大的前提下使得 x 值之和尽量小(在对乙方最有利的前提下对甲方最不利)。 现在你应当慎重地提名 s 位候选人使得最终由乙方律师确定的 t 人 x 值和最大,若有多种方案,则应再使被乙方排除掉的 s-t人的 y 值和尽量大,在此基础上最大化 s 人的 x 值 之和,在此基础上最小化 s 人的 y 值 之和。 你的当事人并不关心你提名的具体是哪些人,只要你告诉他你提名的 s 人的 x 值之和 与 y 值之和。

Input

第一行包含三个整数 n,s,t。 接下来 n 行,每行两个整数分别表示??, ??。

Output

共一行两个整数,分别为 x 值之和与 y 值之和。 

Data Constraint

对于 30%的测试数据n ≤ 20
对于 50%的测试数据n ≤ 100
对于 100%的测试数据? ≤ 100000, ?, ? ≤ 1000000

解题思路:思路有点绕的贪心。

首先挑出所有可能成为陪审团成员之一的人。

对Y最优的情况:yk最大的t个人都在备选行列内。

此时Y可以挑这t个yk最大的人。

对Y最劣的情况:yk最大的n-s个人都不在备选行列内。

此时Y只能挑yk排名从n-s+1到n-s+t这t个人。

因此yk值排名前n-s+t个人都有可能成为陪审团成员之一。

在第一次排序中若yk值相同,则按xk值从小到大排列。

因为Y的策略是保证yk值最大的前提下使xk值最小,因此若最后几个人yk值都相同,Y会挑xk

值小的,而xk值大的并没有被挑走的可能。

然后把这n-s+t个人按xk从大到小排序,我们要让排名前t个人成为陪审团。

让他们成为陪审团有一定条件:

备选队列里的其他人yk值必须严格小于陪审团成员yk值的最小值。

为什么不能等于?因为若yk值相等,Y就会挑xk值小的。除非xk,yk这两个值均相同,否则

陪审团总xk值就会变小。

为了让Y排除掉的那s-t个人yk值尽量大,我们需要让陪审团成员yk值尽量大。

因此第二次排序时若xk值相同,就按yk值从大到小排列。

接下来要从剩下的n-t个人中挑选那s-t个人。

因为要使Y排除掉的那s-t个人yk值尽量大,因此我们按yk值从大到小排序。

同时我们还要使备选成员的xk值总和尽量大,因此yk值相同时按xk值从大到小排列。

选出前s-t个人即可。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define INF 0x3f3f3f3f
#define ll long long
using namespace std;
ll n,s,t,cnt,ansx,ansy;
struct uio{ll vx,vy;
}peo[100001],peo1[100001];
bool cmp1(uio x,uio y)
{if(x.vy==y.vy) return x.vx<y.vx;return x.vy>y.vy;
}
bool cmp2(uio x,uio y)
{if(x.vx==y.vx) return x.vy>y.vy;return x.vx>y.vx;
}
bool cmp3(uio x,uio y)
{if(x.vy==y.vy) return x.vx>y.vx;return x.vy>y.vy;
}
int main()
{scanf("%lld%lld%lld",&n,&s,&t);for(ll i=1;i<=n;i++)scanf("%lld%lld",&peo[i].vx,&peo[i].vy);sort(peo+1,peo+1+n,cmp1);sort(peo+1,peo+1+n-s+t,cmp2);ll mnx=INF,mny=INF,mxx=-1,mxy=-1;for(ll i=1;i<=t;i++){ansx+=peo[i].vx,ansy+=peo[i].vy;mnx=min(mnx,peo[i].vx),mny=min(mny,peo[i].vy);mxx=max(mxx,peo[i].vx),mxy=max(mxy,peo[i].vy);}for(ll i=1;i<=n;i++)if(peo[i].vy<mny) peo1[++cnt]=peo[i];sort(peo1+1,peo1+1+cnt,cmp3);for(ll i=1;i<=s-t;i++)ansx+=peo1[i].vx,ansy+=peo1[i].vy;printf("%lld %lld\n",ansx,ansy);return 0;
}


T3 题意简述:jzoj4676

Description

科学家温斯顿从数据库中找到了一串相当长的字符串。
他正试图用一个模板串来重构这个字符串。
他可以将模板串复制多份,通过合适的方式拼接起来,使得最终的串与原串一致。
如果两个模板串互相覆盖,那么覆盖的部分必须完全一致。
原串的所有位置必须被覆盖到。
显然,原串本身就是一个模板串。但为了节省成本,他想找到长度最短的模板串。

Input

第一行一个仅由小写字母构成的字符串。

Output

第一行一个整数,表示模板串的最小长度。

Data Constraint

设字符串的长度为N。
Subtask1[20pts]:N<=100
Subtask2[30pts]:N<=25000
Subtask3[50pts]:N<=500000

解题思路:一道KMP瞎搞的题,也可以用dp。这里介绍dp做法。

当然,字符串匹配的题要先把next数组求出来。

设dp[i]表示能完全覆盖前缀i的最短前缀的长度。

发现dp[i]最多只有2种取值:i或是dp[next[i]]。

因为能完全覆盖一个字符串a的字符串b必同时是a的前缀和后缀。

考虑何时dp[i]=dp[next[i]]。

显然,最后next[i]个字符是肯定要被一个长为next[i]的前缀覆盖的。

除去这next[i]个字符,前面的字符要用若干个前缀覆盖。

为保证完全覆盖,覆盖前i-next[i]个字符的最后一个前缀与覆盖从第i-next[i]+1个字符到

第i个字符的这个前缀必然是首尾相接或是有重合部分的。如下图所示:

因此只需在[i-next[i],i]区间内找有没有dp[j]=dp[next[i]]的。

有则dp[i]=dp[next[i]],否则dp[i]=i。

每次转移时都找一遍太慢了,只需开数组mx[i]记录dp[j]=i的最大的j即可。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
int n,next[500001],dp[500001],mx[500001];
char s[500001];
void getnxt()
{int num=0;for(int i=2;i<=n;i++){while(num&&s[num+1]!=s[i]) num=next[num];if(s[num+1]==s[i]) num++;next[i]=num;}
}
int main()
{scanf("%s",s+1);n=strlen(s+1);getnxt();for(int i=1;i<=n;i++){if(mx[dp[next[i]]]>=i-next[i]) dp[i]=dp[next[i]];else dp[i]=i;mx[dp[i]]=i;}printf("%d\n",dp[n]);return 0;
}

转载于:https://www.cnblogs.com/water-radish/p/9496385.html

2018.8.17提高B组模拟考试相关推荐

  1. 2018.8.16提高B组模拟考试

    永远不要把时间交给一道打表题. T1 题意简述:jzoj4674 Description 科学家温斯顿定义了一个无限重复的数列:1234321234321234321--,并将其称为时钟序列. 他发现 ...

  2. JZOJ 5814. 【NOIP提高A组模拟2018.8.14】 树

    梦游中的你来到了一棵 N 个节点的树上. 你一共做了 Q 个梦, 每个梦需要你从点 u 走到点 v 之后才能苏醒, 由于你正在梦游, 所以每到一个节点后,你会在它连出去的边中等概率地选择一条走过去, ...

  3. 5814. 【NOIP提高A组模拟2018.8.14】 树(期望 + 倍增)

    5814. [NOIP提高A组模拟2018.8.14] 树 Problem 给定一棵nnn个点的树,m" role="presentation">mmm次询问,每次 ...

  4. JZOJ 5372. 【NOIP2017提高A组模拟9.17】猫

    Description 信息组最近猫成灾了!隔壁物理组也拿猫没办法.信息组组长只好去请神刀手来帮他们消灭猫.信息组现在共有n 只猫(n 为正整数),编号为1 到n,站成了一个环,第i 只猫的左边是第i ...

  5. 特岗计算机考试题2018年,2020年特岗模拟考试试题及答案.pdf

    2020 年特岗模拟考试试题及答案(精选) 一.单选题(共 100 题,每题 0.7 分,共 70 分) 1. 儿童在知道"苹果"."梨"等概念后,再学习&qu ...

  6. 5817. 【NOIP提高A组模拟2018.8.15】 抄代码

    Description J 君是机房的红太阳,每次模拟她总是 AK 虐场.然而在 NOIP2117 中,居然出现了另一位 AK 的选手 C 君! 这引起了组委会的怀疑,组委会认为 C 君有抄袭 J 君 ...

  7. JZOJ 5820. 【NOIP提高A组模拟2018.8.16】 非法输入

    Description 在算法竞赛中,题目一般保证了输入数据的合法性.然而在工程开发中,我们往往不期望程 序得到的输入都是合法的. D 君正忙着向校内 OJ 添加题目,在写了第 233 个 val.c ...

  8. 2018.07.17【省赛模拟】模拟B组 比赛总结

    题目 [GDKOI2003]最大公共子串 [题目描述] 从一个给定的串中删去(不一定连续地删去)0个或0个以上的字符,剩下的字符按原来的顺序组成的串是该串的字串.例如:"", &q ...

  9. JZOJ 5371. 【NOIP2017提高A组模拟9.17】组合数问题

    Description 定义"组合数"S(n,m)代表将n 个不同的元素拆分成m 个非空集合的方案数.举个例子,将{1,2,3}拆分成2 个集合有({1},{2,3}),({2},{1,3}),({3 ...

最新文章

  1. linux C++打包程序总结
  2. 【操作系统】进程间通信的五种方式
  3. [剑指offer]面试题8:旋转数组的最小数字
  4. GW48CK/PK2/PK/PK4 系统万能接插口与结构图信号/与芯片引脚对照表
  5. Redmi Note 11系列来势汹汹,一“机”打尽更多看不见的旗舰猛料
  6. C语言 socket
  7. Prototype使用$F()函数
  8. 学完这个PPT设计课程后,我实现了月入3w+!
  9. ubuntu18下查看opencv版本、多版本之间的共存,切换、下载地址
  10. python的拼音_Python之拼音拆分
  11. 使用迅雷9.1.48从ftp服务器下载文件
  12. 【MIT 6.0001 课程笔记】Problem Set 1
  13. php octet stream,php 上传excel时,excel mime-type类型为application/octet-stream,无法通过验证...
  14. vuecli项目打包
  15. 〖Python WEB 自动化测试实战篇⑧〗- 实战 - 利用 selenium 处理弹出框
  16. 【python逆向一把梭】pyinstaller打包的exe逆向一把梭
  17. “小小的世界大大的你”演讲全文,这是衡中的呐喊,这是我们每个人都该为自己呐喊,我们不甘平庸
  18. (转)私募基金机构设立、牌照申请、后续运营的最新政策规定和操作流程
  19. 三朝元老经验(转,推荐)
  20. Econometrics Homework (Lab Course: Chapters 2, 3, 4)

热门文章

  1. php 变成 25,2020-09-25 PHP变量介绍
  2. java多态 降低代码耦合性_深度分析:理解Java中的多态机制,一篇直接帮你掌握!...
  3. 数学建模题目及论文_三道适合作为试题的数学建模题目及其评分标准
  4. linux 32位redis安装,CentOS 5.5 32位上安装Redis 2.6报错解决
  5. python运维面试题_PYTHON运维开发面试题整理
  6. matlab在电气工程中的数值分析
  7. Matlab学习笔记——文件的打开与关闭
  8. 漫谈时序设计(3)走进时序约束的大门!
  9. 【Verilog HDL 训练】第 10 天(PWM 呼吸灯)
  10. P5147 随机数生成器 [数列]