前言

……终于改完了,像之前小L一样崩溃。今天C组和B组一起做题,所以……


正题


题目1:教主的花园(jzoj1792)

一平面直角坐标系,在x轴的位置建立一堵墙,墙上有n道门,给出门的位置,询问两个坐标的距离(曼哈顿)。

输入输出(建议无视)

Input

输入的第1行为一个正整数N,为屏障上入口的个数。
第2行有N个整数,a1, a2, …, aN,之间用空格隔开,为这N个入口的横坐标。
第3行为一个正整数M,表示了M个询问。
接下来M行,每行4个整数x1, y1, x2, y2,有y1与y2均不等于0,表示了一个询问从(x1, y1)到(x2, y2)的最短路。

Output

输出共包含m行,第i行对于第i个询问输出从(x1, y1)到(x2, y2)的最短路距离是多少。

Sample Input

2
2 -1
2
0 1 0 -1
1 1 2 2

Sample Output

4
2

解题思路

有三种情况
1. 坐标之间不隔墙
2. 坐标之间隔墙,并且最近的墙在两个坐标之间:

3. 坐标之间隔墙,并且最近的墙在两个坐标之间

然后前两种情况之接输出曼哈顿距离,第三种情况输出两个距离门的距离和。
用二分确定最近的门

代码

#include<cstdio>
#include<algorithm>
using namespace std;
int n,a[100001],m,x,y,zx,zy,l,r,mid,last;
bool ok;
int abs(int x)
{if (x<0) return 0-x;else return x;
}
int main()
{scanf("%d",&n);for (int i=1;i<=n;i++)scanf("%d",&a[i]);sort(a+1,a+1+n);//排序scanf("%d",&m);for (int i=1;i<=m;i++){scanf("%d%d%d%d",&x,&y,&zx,&zy);//输如if (y<0 && zy>0 || y>0 && zy<0)//如果中间隔墙{l=1;r=n;last=2147483647;//last记录离门最近距离ok=true;while (l<=r){mid=(int)(l+r)/2;if (zx>a[mid] && x<a[mid] || zx<a[mid] && x>a[mid])//如果门在中心{l=mid;last=0;break;//退出}if (min(abs(a[mid]-x),abs(a[mid]-zx))*2<last)//如果找到更近的距离{last=min(abs(a[mid]-x),abs(a[mid]-zx))*2;//记录if (a[mid]<x) l=mid;else r=mid;}elseif (a[mid]<x) l=mid+1;else r=mid-1;}printf("%d\n",last+abs(x-zx)+abs(zy-y));//输出}else printf("%d\n",abs(zx-x)+abs(zy-y));//输出}
}

题目2:教主泡嫦娥(jozj1793)

有一个环形山地,有n个落脚点,可以从任意落脚点任意状态出发。每个落脚点的代价为

当教主从第i个落脚点,走到第j个落脚点的时候(i和j相邻)
j的海拔高于i的海拔:如果教主处于上升状态,教主需要耗费两段高度差的绝对值的体力;否则耗费高度差平方的体力。
j的海拔低于i的海拔:如果教主处于下降状态,教主需要耗费两段高度差的绝对值的体力;否则耗费高度差平方的体力。

求走一圈的最小代价

输入输出(建议无视)

Input

输入的第一行为两个正整数N与M,即落脚点的个数与切换状态所消耗的体力。
接下来一行包含空格隔开的N个正整数,表示了每个落脚点的高度,题目保证了相邻落脚点高度不相同。

Output

输出仅包含一个正整数,即教主走一圈所需消耗的最小体力值。
注意:C++选手建议使用cout输出long long类型整数。

Sample Input

6 7
4 2 6 2 5 6

Sample Output

27

解题思路

如果枚举落脚点肯定会超时,所以我们就不能这么做。
用f[i][j][k]表示在第i个落脚点,状态为j,在当前有没有改变状态。
然后O(n)的时间复杂度轻易过
动态转移方程:
f[i][j][0]=f[i-1][j][0]+abs(a[i]-a[i-1]) 直接走过
f[i][j][1]=min(f[i-1][j][1],min(f[i-1][j^1][0],f[i-1][j^1][1])+m)+abs(a[i]-a[i-1]) 改变状态

f[i][j][0]=f[i-1][j][0]+pows(a[i]-a[i-1])
f[i][j][1]=min(f[i-1][j][1],min(f[i-1][j^1][0],f[i-1][j^1][1])+m)+pows(a[i]-a[i-1])
在这题被逼疯,默默AC不想说话

代码

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
long long f[10001][2][2],ans;
int a[10001],n,m;
long long abs(long long x)
{if (x<0) return 0-x;else return x;
}
long long pows(long long x)
{return x*x;}
void dp()
{f[0][1][1]=f[0][0][1]=1e16-1;for (int i=1;i<=n;i++)for (int j=0;j<2;j++)if ((a[i]<a[i-1])^j){f[i][j][0]=f[i-1][j][0]+abs(a[i]-a[i-1]);f[i][j][1]=min(f[i-1][j][1],min(f[i-1][j^1][0],f[i-1][j^1][1])+m)+abs(a[i]-a[i-1]);}else{f[i][j][0]=f[i-1][j][0]+pows(a[i]-a[i-1]);f[i][j][1]=min(f[i-1][j][1],min(f[i-1][j^1][0],f[i-1][j^1][1])+m)+pows(a[i]-a[i-1]);}//动态转移
}
int main()
{scanf("%d%d",&n,&m);for (int i=0;i<n;i++){scanf("%d",&a[i]);}a[n]=a[0];memset(f,0ll,sizeof(f));dp();//dp一次ans=min(min(f[n][0][0],f[n][0][1]),min(f[n][1][0],f[n][1][1]));//取最小情况memset(f,0ll,sizeof(f));f[0][0][0]=1e16-1;//从f[0][1][0]推过去dp();//dp一次ans=min(ans,f[n][1][1]-m);//取值memset(f,0ll,sizeof(f));f[0][1][0]=1e16-1;//从f[0][0][0]推过去dp();//dp一次ans=min(ans,f[n][0][1]-m);//取值cout<<ans<<endl;
}

题目3:保镖排队(jzoj1794)

有n个保镖,除第一个保镖外每个保镖都有一个上司,每个上司的下属都有在上司心目中的武力值。排队要求:

①互为上司-下属的两个保镖,上司在前,下属在后
②对于一个保镖的所有下属,武功实力较强的在前,较弱的在后。

求排队方案数

输入输出(建议无视)

Input

输入的第一行为一个正整数T,表示了数据组数。
对于每组数据:
第一行为一个正整数N。
接下来N行,每行描述一个保镖。
第i+1行,会有一个整数K,代表第i个保镖的下属个数,接下来K个数,代表第i个保镖的下属按照武功实力从高到低的编号。

Output

输出包括C行,每行对于每组数据输出方案数mod 10007后的结果。

Sample Input

2
5
2 2 3
2 4 5
0
0
0
7
2 2 3
2 4 5
2 6 7
0
0
0
0

Sample Output

3
10

解题思路

首先想到的是树形dp,由于保镖一没有上司所以一定是根。然后就是插空问题了,将3个保镖插入到3个空中,用组合的方法求插空方案数。用杨辉三角求组合。然后树形dp

代码

#include<cstdio>
#include<cstring>
using namespace std;
struct line{int y,next;
}a[10001];//邻接表
int f[1001],s,ls[1001],n,k,t,w,head,num[1001];
int cost[1002][1002];
void dp(int x)
{int q=ls[x];f[x]=1;if (q==0){num[x]=1;return;//没有子树}while (q!=0){dp(a[q].y);num[x]+=num[a[q].y];//累计f[x]=((f[x]*f[a[q].y])%10007)*(cost[num[x]-1][num[a[q].y]-1])%10007;//求方案数q=a[q].next;}num[x]++;//算上自己
}
int main()
{cost[0][0]=1;for (int i=1;i<=1001;i++)for (int j=1;j<=i;j++){cost[i][0]=1;cost[i][j]=(cost[i-1][j]+cost[i-1][j-1])%10007;}//杨辉三角scanf("%d",&t);for (int ti=1;ti<=t;ti++){w=0;s=0;memset(ls,0,sizeof(ls));memset(f,0,sizeof(f));memset(num,0,sizeof(num));//初始化scanf("%d",&n);for (int i=1;i<=n;i++){scanf("%d",&k);for(int j=1;j<=k;j++){scanf("%d",&a[++w].y);a[w].next=ls[i];ls[i]=w;}}dp(1);//dpprintf("%d\n",f[1]);}
}

题目4:教主的别墅(jzoj1795)

有N个人,有男有女,分成m段连续的部分,求分割的最小和最大字典序。

输入输出(建议无视)

Input

  输入的第1行为两个正整数N与M,用空格分隔。
  第2行包含一个长度为N的串,仅由字符组成,第i 个字符为0表示在这个位置上的LHXee为女生,若为1则为男生。

Output

  输出文件包含两行,每行M个正整数,正整数之间用空格隔开,行末无多余空格。这M个正整数从左到右描述了你所分的每个组的人数。
  第1行为字典序最小的方案,第2行为字典序最大的方案。

Sample Input

8 3
11001100

Sample Output

1 2 5
5 2 1

解题思路

这道题贪心竟然能过???

深搜TLE,贪心只能过样例

听某dalao讲用前缀和到第i个房间的男女差值(绝对值),然后每个房间最大差值为:

summsumm

\frac{sum}{m}
然后正推一次反推一次。

#include<cstdio>
#include<iostream>
using namespace std;
int n,m,sum[5000002],ans,anss,t,last,w,a[100002];
char c;
int abs(int x)
{if (x<0) return 0-x;else return x;
}//绝对值
int main()
{scanf("%d%d\n",&n,&m);for (int i=1;i<=n;i++){cin>>c;if (c=='0') sum[i]-=1;else sum[i]+=1;sum[i]+=sum[i-1];}ans=abs(sum[n])/m;//求最大差值if (abs(sum[n])%m!=0) ans++;//向上取整if (sum[n]==0){int l=0;for (int i=1;i<=n;i++)if (sum[i]==0) l++;if (l>=m) ans=0;else ans=1;//能否做到没有差值}t=m;last=0;for (int i=1;i<=n;i++){anss=abs(sum[n]-sum[i])/(t-1);if (abs(sum[n]-sum[i])%(t-1)!=0) anss++;if (abs(sum[i]-sum[last])<=ans && anss<=ans){printf("%d ",i-last);last=i;t--;if (t==1) break;}}//查找printf("%d\n",n-last);ans=abs(sum[n])/m;if (abs(sum[n])%m!=0) ans++;if (sum[n]==0){int l=0;for (int i=1;i<=n;i++)if (sum[i]==0) l++;if (l>=m) ans=0;else ans=1;}t=m;last=n;w=0;for (int i=n-1;i>=1;i--){anss=abs(sum[i])/(t-1);if (abs(sum[i])%(t-1)!=0) anss++;if (abs(sum[last]-sum[i])<=ans && anss<=ans){a[++w]=last-i;last=i;t--;if (t==1) break;}}//倒着查找a[++w]=last;//记录for (int i=w;i>=1;i--) printf("%d ",a[i]);
}

【jzoj】2018.2.7NOIP普及组——某【BC】组模拟赛相关推荐

  1. 2020蓝桥杯B 组省赛计蒜客模拟赛(一)题解

    2020蓝桥杯省赛 B 组计蒜客模拟赛(一)目录 试题 A:有趣的数字(结果填空) 试题 B:爬楼梯(结果填空) 试题 C:七巧板(结果填空) 试题 D:苹果(结果填空) 试题 E:方阵(结果填空) ...

  2. JZOJ(中山纪念中学) 2018.02.02【NOIP普及组】模拟赛D组

    本次题目:2018.02.02[NOIP普及组]模拟赛D组 第一题 题目:第一题 公牛数字 题意: 求题目给出两个数字的乘积 分析: 这题明显只是考察学生的高精可我居然没做对,只要多练习几次,即可AC ...

  3. 2018年10月17日普级B组【模拟赛】

    2018年10月17日普级B组模拟赛2018年10月17日普级B组模拟赛2018年10月17日普级B组模拟赛 第一题--ISBN号码第一题--ISBN号码第一题--ISBN号码 博客链接: https ...

  4. 2020.04.08【NOIP普及组】模拟赛C组24 总结

    2020.04.08 2020.04.08 2020.04.08[ N O I P NOIP NOIP普及组]模拟赛 C C C组 24 24 24 总结 概述: 这次比赛我 A K AK AK了,拿 ...

  5. 计蒜客信息学3月普及组模拟赛

    A. 断幺九 题目链接 分值:100 时间限制:1000ms 测试点数目:10 B. 锈湖 题目链接 分值:100 时间限制:2000ms 测试点数目:10 C. 图  题目链接 分值:100 时间限 ...

  6. DD 摆磁铁(计蒜客信息学8月普及组模拟赛)

    DD 摆磁铁 这道题来自 计蒜客信息学8月普及组模拟赛 普及组!! 把我一个TG选手看懵了 看来我要回去打普及了 题目大意 给出一个n个节点的树,要把树上给定的2*m个节点两两配对,两个节点配对的产生 ...

  7. 2018年全国职业院校技能大赛中职组网络空间安全正式赛卷

    2018年全国职业院校技能大赛中职组网络空间安全正式赛卷 一.竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段 单兵模式系统渗透测试 任务1 MSSQL数据库渗透测试 100分钟 10 ...

  8. 2021.08.09【普及组】模拟赛C组比赛总结

    文章目录 2021.08.09[普及组]模拟赛C组比赛总结 写在前面: T1 :[普及模拟]生产武器 题目大意: 正解: T2 :[普及模拟]城市连接 题目大意: 正解: T3 :[普及模拟]抢救文件 ...

  9. 2018年第九届C/C++ A组蓝桥杯省赛真题(python解法)

    2018年第九届C/C++ A组蓝桥杯省赛真题 第一题:哪天返回 题目描述 小明被不明势力劫持.后莫名其妙被扔到x星站再无问津.小明得知每天都有飞船飞往地球,但需要108元的船票,而他却身无分文. 他 ...

最新文章

  1. java实现异步调用实例
  2. 古罗马皇帝凯撒在打仗时曾经使用过以下方法加密军事情报: 请编写一个程序,使用上述算法加密或解密用户输入的英文字串...
  3. 算法练习day6——190323(求中位数、堆排序、稳定性)
  4. 手机用鸿蒙,魅族“很聪明”:宣布加入鸿蒙,让大家以为手机用鸿蒙,其实不是...
  5. redis在php中的用法,使用PHP-redis操作Redis
  6. MYSQL-skip-networking
  7. 子域名收集常用工具(Layer、subDomainsBrute、sublist3r、dnsenum)
  8. 每天学一点Scala之Try
  9. 一个按钮控制暂停和开始java_《第一炉香》|一个女人的自甘堕落,从控制不住欲望开始...
  10. PROTUES实例——stm32点灯
  11. SQL 2008客户端ODBC配置DSN时使用网络登录ID的windows NT验证登录时 报18452错误
  12. 我看韩剧《寄生虫》,一副好牌究竟是怎么被打烂的?
  13. 隐私计算技术|深度解读可信隐私计算框架“隐语”
  14. 【R生态】非参数多元检验(ADONIS、ANOSIM、PERMANOVA及MRPP等多元方差分析)
  15. Mvc动态注册HttpModule详解
  16. Chrome谷歌浏览器的快捷键:
  17. HBase配置AES加密
  18. taro3 支付宝小程序 -- 授权手机号和用户信息
  19. hdu 3944 数学组合+帕斯卡定理
  20. 电脑键盘打字产生 打字机的声音效果

热门文章

  1. saiku 连接 MySQL_Saiku连接mysql数据库(二)
  2. java中注解的解析_全面解析Java中的注解与注释
  3. 经纬度 c代码中定义_如何将TXT文本格式的批量经纬度值导入到奥维成为标签
  4. 单片机C语言中空语句,单片机C语言中的空语句.doc
  5. [RabbitMQ]常用命令
  6. [SpringSecurity]HelloWorld入门案例
  7. [C++11]move资源的转移
  8. [剑指offer]面试题31:连续子数组的最大和
  9. 算法导论10-2.4题
  10. Ticket Game CodeForces - 1215D(博弈题,巴什博弈思维)