T1浇水:

  题目描述

  •   在一条长n米,宽m米米的长方形草地上放置着k个喷水装置。假设长方形草地的坐标范围为[ 0 , 0 ] ~ [ n , m ],那么第 i 个喷水装置的位置为(ai,m/2),也就是说喷水装置全部位于一条直线上。此外第 i 个喷水装置能向半径ri的圆形区域内喷水。
  • 负责管理喷水装置的园丁老大爷想知道,要想覆盖整个草地,至少需要开启多少个喷水装置。

  输入格式

  • 第一行三个正整数 k , n , m 。其中 m 为偶数。
  • 接下来 k 行,每行两个整数ai 和ri ,代表第 i  个喷水装置的横坐标和喷水半径。

  输出格式

  • 一个整数 ans 代表至少需要开启的喷水装置数量。若所有装置都开启依然不能覆盖整个草地则输出-1 。

  样例

  样例输入1

  1.  

  样例输出1

  样例输入2

  1.  

  样例输出2

  数据范围与提示

  • 样例1 解释开启位于4和12的喷水装置即可。
  • 30%的数据中:k ≤ 20。
  • 另有20%的数据中:ri均相等。
  • 100%的数据中:m≤20000,ri≤10000,n,k≤100000,ai

  分析:

  •   喷水装置在长方形的中线上,如果某个喷水装置能喷到左上角的地方,那左下角必定能喷到。
  • 如果喷水装置的喷水半径小于此装置无用
  • 所以我们可以预处理出每一个喷水装置能喷到的左、右最远的距离,然后对其左边界进行排序,从左到右,一次枚举花坛的未喷到的最远点,在能喷到的装置中找到右端点最远的装置。
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=1e5+;
  4. int k,n,m;
  5. int a,r;
  6. int cnt;
  7. struct wat{//记录一个点的左右最远的覆盖范围
  8. double L;//double!!!
  9. double R;
  10. }w[N];
  11.  
  12. bool cmp(wat a,wat b){//按
  13. return a.L<b.L;
  14. }
  15.  
  16. int main(){
  17. scanf("%d%d%d",&k,&n,&m);//输入
  18. for(int i=;i<=k;i++){
  19. scanf("%d%d",&a,&r);
  20. if(r*<=m)continue;//去除一些没用的喷水装置
  21. w[++cnt].L=a-sqrt(r*r-m*m/4.0);//等于也不行(喷一个线有啥用)
  22. w[cnt].R=a+sqrt(r*r-m*m/4.0);
  23. }
  24. sort(w+,w++cnt,cmp);//排序
  25. double right=;
  26. int ans=;
  27. while(right<n){//
  28. ans++;
  29. double s=right;//用一个s保存right值因为后面的right值要变
  30. for(int i=;i<=k&&w[i].L<=s;i++){
  31. if(right<w[i].R){
  32. right=w[i].R;//更新覆盖的最右边的值
  33. }
  34. }
  35. if(right==s&&s<n){//不满题意
  36. printf("-1\n");
  37. return ;
  38. }
  39. }
  40. printf("%d\n",ans);
  41. return ;
  42. }

T2免费馅饼:

  题目描述:

  • 最新推出了一种叫做“免费馅饼”的游戏:
  • 游戏在一个舞台上进行。舞台的宽度为 w格,天幕的高度为 h格,游戏者占一格。
  • 开始时游戏者站在舞台的正中央,手里拿着一个托盘。下图为天幕的高度为 4 格时某一个时刻游戏者接馅饼的情景。
  • 游戏开始后,从舞台天幕顶端的格子中不断出现馅饼并垂直下落。游戏者左右移动去接馅饼。游戏者每秒可以向左或向右移动一格或两格,也可以站在原地不动。
  • 馅饼有很多种,游戏者事先根据自己的口味,对各种馅饼依次打了分。同时,在 电脑的遥控下,各种馅饼下落的速度也是不一样的,下落速度以格/秒为单位。
  • 当馅饼在某一秒末恰好到达游戏者所在的格子中,游戏者就收集到了这块馅饼。

  • 写一个程序,帮助我们的游戏者收集馅饼,使得所收集馅饼的分数之和最大。

  输入格式:

  •   输入文件的第一行是用空格隔开的两个正整数,分别给出了舞台的宽度 w ( 1到 99之间的奇数)和高度 H( 1到100 之间的整数)。
  • 接下来依馅饼的初始下落时间顺序给出了所有馅饼的信息。每一行给出了一块馅饼的信息。由四个正整数组成,分别表示了馅饼的初始下落时刻(1 到1000 秒),水平位置、下落速度(1  到 100 )以及分值。游戏开始时刻为0从 开始自左向右依次对水平方向的每格编号。
  • 输入文件中同一行相邻两项之间用一个或多个空格隔开

  输出格式:

  • 输出文件的第一行给出了一个正整数,表示你的程序所收集的最大分数之和。

  样例:

  样例输入:

  1.  

  样例输出:

  1.  

  数据范围与提示:

  • 0≤馅饼个数 ≤2500。

  分析:

  • 一道移动DP题。这题初看无从下手,馅饼和人都在移动,但仔细分析可得:定馅饼不动,由人移动去接馅饼。
  • 想好两点:
    •   只有高度可以被下落速度整除时,改馅饼才有被接住的可能。
    • 时间可以当作纵坐标处理,即
  • 设f [ i ] [ j ],i 表示时刻,j表示x坐标。用k枚举移动的距离(k只能取-2,-1,0,1,2)。
  • 动态转移方程为:f [ i ] [ j ] = max(f [ i - 1 ] [ j + k ] + a [ i ] [ j ]);
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=;
  4. int w,h;
  5. int cnt;
  6. int T,P,V,W,maxtime;
  7. int t[N],p[N],v[N],val[N];
  8. int f[N][N];
  9. int hehe(int i,int j){
  10. int ans=;
  11. for(int k=-;k<=;k++){
  12. if(j+k<||j+k>w)continue;
  13. ans=max(ans,f[i+][j+k]);
  14. }
  15. return ans;
  16. }
  17.  
  18. int main(){
  19. scanf("%d%d",&w,&h);
  20. h--;//注意减一
  21. while(scanf("%d%d%d%d",&T,&P,&V,&W)==){
  22. if(h%V==){
  23. t[++cnt]=T+h/V;//注意+T;
  24. p[cnt]=P;v[cnt]=V;val[cnt]=W;
  25. maxtime=max(maxtime,t[cnt]);//找出下落时间最大的值来
  26. }
  27. }
  28. if(cnt==){//如果都不符合那就结束
  29. printf("");
  30. return ;
  31. }
  32. for(int i=;i<=cnt;i++){//可能有不同时出发的但同时同地落下的馅饼。累加。
  33. f[t[i]][p[i]]+=val[i];
  34. }
  35. for(int i=maxtime-;i>=;i--){//从后往前
  36. for(int j=w;j>=;j--){//maxtime注意减一因为转移有范围。
  37. f[i][j]+=hehe(i,j);
  38. }
  39. }
  40. printf("%d",f[][(w+)/]);//f数组定义的是从i秒j地的最大分数
  41. return ;
  42. }

T3压缩:dp(★★★★★★★★★★★★★★★★★★★★★★★★★......)

  呵呵,洛谷紫题,教练拿来当作入门题考,beng......

  题目描述:

  • 给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复信息。压缩后的字符串除了小写字母外还可以(但不是必需)包含大写字母R 与M ,其中 M 标记重复串的开始, 重复从上一个 R(如果当前位置左边没有M ,则从串的开始算起)开始的解压结果(称为缓冲串)。
  • bcdcdcdcd可以压缩为bMcdRR。

   输入格式:

  • 输入仅一行,包含待压缩的字符串,仅包含小写字母,长度为n。

  输出格式:

  • 输出仅一行,即压缩后字符串的最短长度。

  样例:

  样例输入1:

  1. aaaaaaa

  样例输出1:

  样例输入2:

  1. bcdcdcdcdxcdcdcdcd

  样例输出2:

  数据范围与提示:

  50%的数据满足:1≤n≤20。

  100%的数据满足:1≤n≤50。

  分析:

  • 设f[i][j][0]表示i到j的区间没有M的情况:

    • 如果前半段与后半段相等,f[i][j][0] = min(f[i][j][0],f[i][mid][0]+1);
    • 如果[i~j],但有可能[i~k](i<k<j)可以折叠,f[i][j][0] = min(f[i][j][0],f[i][k][0]+j-k);
  • f[i][j][1]表示i到j的区间内有M的情况:
    • k枚举的是M的位置,即在k的后面放一个M:
    • f[i][j][1] = min(f[i][j][1],min(f[i][k][0],f[i][k][1])+min(f[k+1][j][0],f[k+1][j][1]))
    • 对区间[i , k]和[k+1,j]均有两种选择,然后加上M这个1。
  • 最后输出ans = max(f[i][len][0],f[1][len][1])。
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N=;
  4. char s[N];
  5. int f[N][N][];
  6.  
  7. bool judge(int l,int r){//判断前一半是否和后一半相等
  8. if((r-l+)&)return false;//长度为奇数
  9. int mid=(l+r)>>;
  10. for(int i=l;i<=mid;i++)
  11. if(s[i]!=s[i+mid-l+])return false;
  12. return true;
  13. }
  14.  
  15. int main(){
  16. scanf("%s",s+);
  17. int len = strlen(s+);
  18. for(int i=;i<=len;i++)//初始化为没有折叠
  19. for(int j=i;j<=len;j++)
  20. f[i][j][]=f[i][j][]=(j-i+);
  21. for(int l=;l<=len;l++){
  22. for(int i=,j;(j=i+l)<=len;i++){//i为区间起点,j为区间终点
  23. if(judge(i,j))//区间[i,j]正好能折叠
  24. f[i][j][]=min(f[i][(i+j)/][]+,f[i][j][]);
  25. for(int k=i;k<j;k++)//枚举区间的断点,有可能[i,k]能折叠
  26. f[i][j][]=min(f[i][j][],f[i][k][]+j-k);
  27. for(int k=i;k<j;k++)//枚举M的位置,即在k的后面加一个M
  28. f[i][j][]=min(f[i][j][],std::min(f[i][k][],f[i][k][])+min(f[k+][j][],f[k+][j][])+);
  29. }
  30. }
  31. printf("%d\n",min(f[][len][],f[][len][]));
  32. return ;
  33. }

T4枪战Maf:(思维★★)

  题目描述:

  •   有 n个人,用1~n进行编号,每个人手里有一把手枪。一开始所有人都选定一个人瞄准(有可能瞄准自己)。然后他们按某个顺序开枪,且任意时刻只有一个人开枪。因此,对于不同的开枪顺序,最后死的人也不同。

  输入格式:

  •   输入n 人数n<1000000
  • 接下来n个数,依次为每个人的aim。

  输出格式:

  •   输出只有一行,共两行整数,为最后死亡的最小和最大人数。

  样例输出:

  样例格式:

  分析:

  设最大存活人数Max,最少存活人数Min

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=;
  4. int n;
  5. int aim[N];
  6. int Min,Max;
  7. int q[N],rd[N];
  8. bool die[N],live[N];
  9. int main(){
  10. scanf("%d",&n);
  11. for(int i=;i<=n;i++){
  12. scanf("%d",&aim[i]);
  13. rd[aim[i]]++;//存入度
  14. }
  15. for(int i=;i<=n;i++){
  16. if(rd[i]==){
  17. Min++;//最小必活数+1
  18. Max++;//队列维护的是入度为0的点
  19. q[Max]=i;
  20. }
  21. }
  22. int aa=;
  23. while(aa<=Max){//扫描队列
  24. int front=q[aa++];//取出队首并出队
  25. if(die[aim[front]])continue;//队首目标已死(多个入度为0的点指向一个点)
  26. die[aim[front]]=;//队首目标必死
  27. int faim=aim[aim[front]];//队首目标的目标可死可不死,看决策
  28. rd[faim]--;
  29. live[faim]=;//可以让他活,但想死的时候随时可以让他死,在环可以最后死
  30. if(rd[faim]==){//虽然入度为0,但不一定是必活,所以Min不加
  31. q[++Max]=faim;
  32. }
  33. }//下面处理只剩下环
  34. for(int i=;i<=n;i++){
  35. if(rd[i]&&!die[i]){
  36. int l=,flag=;//l记录环大小,flag标记环上是否有live的点
  37. for(int j=i;!die[j];j=aim[j]){
  38. l++;
  39. flag|=live[j];
  40. die[j]=;//标记已死,避免其他的再来计算
  41. }
  42. if(!flag&&l>)Min++;//l=1表示自环,必死
  43. Max+=l/;
  44. }
  45. }
  46. printf("%d %d",n-Max,n-Min);
  47. return ;
  48. }

博主在没有任何编辑器的恶劣情况下成功夺得514高地(敲了一个多小时),点赞关注顶一下呗......@^_^@......

6.30集训模拟赛4(炸裂的一天qwq)的更多相关文章

  1. 冲刺$\mathfrak{CSP-S}$集训模拟赛总结

    开坑.手懒并不想继续一场考试一篇文. 既没必要也没时间侧边栏的最新随笔题解反思相间也丑 而且最近越来越懒了竟然都不写题解了……开坑也是为了督促自己写题解. 并不想长篇大论.简要题解也得写啊QAQ. 目 ...

  2. 10.30 NFLS-NOIP模拟赛 解题报告

    总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...

  3. 2016.10.30 NOIP模拟赛 day2 PM 整理

    满分:300分 直接全部爆零,真的是很坑啊! 10.30的题目+数据:链接:http://pan.baidu.com/s/1jHXLace 密码:i784 T1: 题目中的难点就是每次折叠的点可能应经 ...

  4. 2016.10.30 NOIP模拟赛 day2 AM 整理

    题目+数据:链接:http://pan.baidu.com/s/1gfBg4h1 密码:ho7o 总共得了:130分, 1:100分  2:30分(只会这30分的暴力) 3:0(毫无思路) 虽然不高, ...

  5. EZ 2018 03 30 NOIP2018 模拟赛(六)

    链接:http://211.140.156.254:2333/contest/67 转眼间上次加回来的Rating又掉完了. 这次不知为何特别水,T1想了一段时间没想出来弃了,导致后面心态炸了. T2 ...

  6. 2018.10.30 NOIp模拟赛T2 数字对

    [题目描述] 小 H 是个善于思考的学生,现在她又在思考一个有关序列的问题.        她的面前浮现出一个长度为 n 的序列{ai},她想找出一段区间[L, R](1 <= L <= ...

  7. 2018.10.30 NOIp模拟赛 T1 改造二叉树

    [题目描述] 小Y在学树论时看到了有关二叉树的介绍:在计算机科学中,二叉树是每个结点最多有两个子结点的有序树.通常子结点被称作“左孩子”和“右孩子”.二叉树被用作二叉搜索树和二叉堆.随后他又和他人讨论 ...

  8. 集训模拟赛-1-T2

    好了不要在铺垫了直接整吧就 题目拿来!!!!!!! 倒水 (water) (256MB,1s) [问题描述] 你有一个水桶(记为 0),两个杯子(记为 1,2).水桶中的水量无限,容量也无限.1 号杯 ...

  9. 集训模拟赛-1-T1

    最近学校网课跟得紧没时间写知识点,就拿题解凑个数(bushi 而且前两天我打着打着题解电脑就突然死机 幸运的是 我没有保存(微笑) 废话不多说 上题目! 城市攻击 (city) (256MB,1s) ...

随机推荐

  1. Java实现 LeetCode 面试题13. 机器人的运动范围(DFS)

    面试题13. 机器人的运动范围 地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] .一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左.右.上.下移动一格(不能移动 ...

  2. Android中如何使用单选对话框

    给Button设置OnClick事件设置 int id=0; final String [] s={"单选A","单选B","单选C",&q ...

  3. snowflake原理解析

    Snowflake 世界上没有两片完全相同的雪花. ​ - twitter Snowflake原理 这种方案把64-bit分别划分成多段,分开来标示机器.时间等,比如在snowflake中的64-bi ...

  4. 数据结构之链表(Linked list)

    说明:如果仔细阅读完全文后,可能感觉有些不统一,这里先说明下原因. 链表尾引用不统一:在介绍单链表时,只有一个链表首部的引用(head) 指向第一个节点.你看到后面关于双链表及循环列表时,除了指向第一 ...

  5. Spring-AOP之工作实践(二)

    案例二.前端页面权限控制 对controllor控制器中的某写方法进行增强,如实现页面的按钮权限控制. /** * 保存session的容器 */ public class SessionContex ...

  6. 大话计算机网络一 聊聊UDP

    引言 UDP是一个简单的面向数据报的运输层协议 UDP不提供可靠性,它把应用程序传给IP层得数据发送出去,不保证它们能达到目的地 UDP首部 端口号表示发送进程和接受进程. UDP长度字段指的是UDP ...

  7. Python--文件操作(操作文件)

    文件的操作包含:读.写.修改 文件的多种操作: # 读取文件的所有内容 data = open("yesteday.txt", encoding="utf-8" ...

  8. python数据类型转换&&格式化输出

    ①python的数据类型包含:数字.字符串.列表.元组.字典.集合这六种基本数据类型.不同数据类型的数据可以进行类型的转换. 使用input让用户输入的数据默认为字符串类型: name = input ...

  9. 【译】Introducing YARP Preview 1

    1 YARP YARP是一个项目,用于创建反向代理服务器.它开始于我们注意到来自微软内部团队的一系列问题.他们要么为其服务构建反向代理,要么询问 API 和用于构建 API 的技术.因此我们决定让他们 ...

  10. Request 对象的主要方法

    setAttribute(String name,Object):设置名字为 name 的 request 的参数值 getAttribute(String name):返回由 name 指定的属性值 ...