咒语(curse)

Description

亮亮梦到自己来到了魔法城堡,但一扇巨大的石门阻拦了他通向城堡内的路。 正当他沮丧之际,突然发现门上有一处机关,机关上有一张很长的纸条。

亮亮拿起纸条的一端,只见上面写着打开机关的方法:“打开机关需要念动 符咒,咒语是一串长为 L 的由 0 和 1 组成的字符串。在这张长纸条上列了 n 个 长为 L 的字符串,正确的咒语即是在纷繁的 2^L 种字符串中,与这些纸条上的 字符串相异度之和最小,并且在满足这一条件下,0 的个数最多的字符串。两个 字符串的相异度定义为对应位置不相等的字符对的个数。如‘011’和‘001’的 相异度为 1,因为它们有且只有第二个位置上的字符不相等。”

亮亮拉起纸条,只觉得纸条似乎永远也拉不完。这上面有着数以万计的字符 串,而每一个字符串的长度也或百或千,以人力看来是无法得到正确的咒语。你 能帮帮他,让他得以进入魔法城堡,一窥其中的奥秘吗?

Input

第一行为一个数字 N 。

接下来的 N 行,每行为一个长为 L 的 01 字符串。数据保证 N 个字符串等长。

Output

只有一行,是一个长为 L 的字符串 S,即为正确的咒语。

别看题面这么长,这不是一个渣题 emmm

记录每一位上\(1\)的个数,判断当前位上是\(1\)的个数多还是\(0\)的个数多,决定输出\(1\)或\(0\)

\(pos[i]\)代表\(i\)位置上\(1\)的个数,则\(n-pos[i]\)就代表\(i\)位置上\(0\)的个数.

代码

#include<cstdio>
#include<cstring>
#define R register
using namespace std;
int n,pos[20008],len;
char s[20008];
inline void calc(char *ch)
{
if(!len)len=strlen(ch);
for(R int i=0;i<len;i++)
if(ch[i]=='1')pos[i]++;
}
int main()
{
//freopen("curse.in","r",stdin);
//freopen("curse.out","w",stdout);
scanf("%d",&n);
for(R int i=1;i<=n;i++)
{
scanf("%s",s);
calc(s);
}
for(R int i=0;i<len;i++)
{
if(pos[i]>(n-pos[i]))putchar('1');
else putchar('0');
}
fclose(stdin);
fclose(stdout);
return 0;
}

神光(light)

Description

亮亮成功地念出了咒语,石门缓缓地自动移开,一道道绚丽的神光从城堡内 激射而出。亮亮好奇而又兴奋地走入了城堡中,迎面有一座极长的魔法阵。

魔法阵可以看作一条直线,它被均匀地分成了 1 000 000 000 个位置,一个位 置可以看成是一个格子。有些位置上筑有法坛,一共 N 座。亮亮只有破了眼前 的魔法阵,才能继续前进,而欲破法阵,必须毁掉所有的法坛。

亮亮身前有两根法杖:一根颜色血红,能发红色神光,光芒可以笼罩连续 L 个位置,并摧毁这 L 个位置上所有的法坛,最多使用 R 次;另一根颜色碧绿, 能发绿色神光,光芒可以笼罩连续 2L 个位置,并摧毁这 2L 个位置上所有的法 坛,最多使用 G 次。

法杖的神奇之处在于,L 的值必须由亮亮事先设定好,并且一经设定,便无 法更改。亮亮需要在规定的次数下摧毁所有法坛,并且使得 L 最小。

Input

第一行三个整数 N, R, G。

第 i (2<=i<=n+1) 行一个整数Ai,表示第 i 座法坛的位置。

Output

只有一个整数,表示 L 的最小值 。

数据范围

对于 50%的数据,N <= 100;

对于 100%的数据,1 <= N <= 2000,1 <= R, G, Ai <= 1,000,000,000。

T2竟然是最难的题 emmm,

首先二分不是很难想到吧.(二分我们的\(L\)

看到\(R,G \leq 1e9\),完了,岂不是要打暴力.

后来发现当\(R+G>N\)的时候,直接输出\(1\)即可 emm.(老子有的是,随便放 ╭(╯^╰)╮

然后问题就转变为了\(R,G \leq 2000\),考虑\(DP\)

设\(f[i][j]\)代表使用了\(i\)次红灯,\(j\)次红灯干掉了多少法坛.

显然我们考虑如何传递上面的状态,

则我们

设\(p[i]\)代表从\(i\)位置用红光能干到最靠右的位置

\(q[i]\)代表从\(i\)位置用绿光能干到最靠右的位置

先给出状态转移方程:

\[f[i][j]=max(p[f[i-1][j]+1],f[i][j])\\ f[i][j]=max(q[f[i][j-1]+1],f[i][j])
\]

考虑到\(f[i][j]\)代表着什么。

我们对\(A\)数组进行排序之后,得到的\(f[i][j]\)必定递增(从\(1\)到\(i\)

则我们可以根据这个性质写出状态转移方程.

解释了里面为什么是\(f[i-1][j]\),应该不是很难理解.

代码

#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#define int long long
#define N 2008
#define clear(a) memset(a,0,sizeof a)
#define R register
using namespace std;
inline void in(int &x)
{
int f=1;x=0;char s=getchar();
while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
while(isdigit(s)){x=x*10+s-'0';s=getchar();}
x*=f;
}
int g,G,n,a[N],ans;
int p[N],q[N],f[2][N*1000];//f[i][j]i次红光,j次绿光,能毁多少法坛
inline bool ok(int x)
{
clear(p);clear(q);clear(f);
for(R int i=1;i<=n;i++)
{
for(R int j=i;j<=n;j++)
{
if(a[j]-a[i]+1<=x)p[i]=j;
if(a[j]-a[i]+1<=x*2)q[i]=j;
}
}
p[n+1]=q[n+1]=n;
for(R int i=0;i<=g;i++)
{
int op=i&1;
for(R int j=0;j<=G;j++)
{
if(i!=0)f[op][j]=max(p[f[op^1][j]+1],f[op][j]);
if(j!=0)f[op][j]=max(q[f[op][j-1]+1],f[op][j]);
}
}
return f[g&1][G]==n;
}
signed main()
{
//freopen("light.in","r",stdin);
//freopen("light.out","w",stdout);
in(n),in(g),in(G);
if(g+G>n)
{
puts("1");
return 0;
}
for(R int i=1;i<=n;i++)in(a[i]);
sort(a+1,a+n+1);
int l=0,r=1e9;
while(l<=r)
{
int mid=(l+r)>>1;
if(ok(mid))r=mid-1,ans=mid;
else l=mid+1;
}
printf("%lld",ans);
fclose(stdin);
fclose(stdout);
return 0;
}

迷宫(maze)

Description

 破了魔法阵后,亮亮进入了一座迷宫。这座迷宫叫做“梦境迷宫”,亮亮只 有走出这座迷宫,才能从睡梦中醒来。

 梦境迷宫可以用无向图来表示。它共有 n 个点和 m 条双向道路,每条道路 都有边权,表示通过这条道路所需的时间,且每条道路可以多次经过。亮亮位于 一号点,而出口则是 n 号点。原本,亮亮该找到一条最短路,快速冲出迷宫,然 而,梦境迷宫的特殊之处在于,如果沿着最短路到达出口,亮亮就会永远陷入梦 境。因此,亮亮必须寻找一条次短路。次短路的长度须严格大于最短路(可以有 多条)的长度,同时又不大于所有除最短路外的道路的长度。

 你的任务,就是编写一个程序,帮助亮亮找到通向出口的次短路。

Input

第一行有两个整数 n、m,表示迷宫内共有 n 个点,m 条边。

接下来 m 行,每行三个整数 x、y、z,表示结点 x 和 y 之间连有一条边权为 z 的无向边。

Output

一个整数,表示次短路的长度。

难得T3这么简单,傻逼题啊,直接跑一遍\(Spfa\)求次短路.

考虑我们的次短路和最短路有关系,所以可以在跑最短路的时候跑出次短路.

存在三种情况

  • 能更新最短路
  • 能更新次短路,但是不能更新最短路
  • 只能更新次短路

分类讨论

一.能更新最短路

 这时候我们的次短路直接继承最短路即可.

二.能更新次短路,但是不能更新最短路

 如果我们到达当前点\(u\)所连的\(v\)的最短路无法被更新,显然当前边为一条不优边,我们可以用到达\(u\)的最短路通过当前边来更新到达\(v\)的次短路.(这一情况有些难理解.但是又不太难理解)

三.只能更新次短路

直接通过到达\(u\)的次短路更新到达\(v\)的次短路

代码

#include<cstdio>
#include<queue>
#include<cctype>
#define R register
#define int long long
#define N 5555
using namespace std;
inline void in(int &x)
{
int f=1;x=0;char s=getchar();
while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
while(isdigit(s)){x=x*10+s-'0';s=getchar();}
x*=f;
}
int n,m,head[N],tot,dis[N],diss[N];
bool vis[N];
struct cod{int u,v,w;}edge[800008];
inline void add(int x,int y,int z)
{
edge[++tot].u=head[x];
edge[tot].v=y;
edge[tot].w=z;
head[x]=tot;
}
inline void spfa()
{
for(R int i=1;i<=n;i++)dis[i]=diss[i]=2147483647666LL;
dis[1]=0;vis[1]=true;
queue<int>q;q.push(1);
while(!q.empty())
{
int u=q.front();q.pop();vis[u]=false;
for(R int i=head[u];i;i=edge[i].u)
{
if(dis[edge[i].v]>dis[u]+edge[i].w)
{
diss[edge[i].v]=dis[edge[i].v];
dis[edge[i].v]=dis[u]+edge[i].w;
if(!vis[edge[i].v])
{
vis[edge[i].v]=true;
q.push(edge[i].v);
}
}
if(dis[u]+edge[i].w>dis[edge[i].v] and diss[edge[i].v]>dis[u]+edge[i].w)
{
diss[edge[i].v]=dis[u]+edge[i].w;
if(!vis[edge[i].v])
{
vis[edge[i].v]=true;
q.push(edge[i].v);
}
}
if(diss[edge[i].v]>diss[u]+edge[i].w)
{
diss[edge[i].v]=diss[u]+edge[i].w;
if(!vis[edge[i].v])
{
vis[edge[i].v]=true;
q.push(edge[i].v);
}
}
}
}
printf("%lld",diss[n]);
}
signed main()
{
freopen("maze.in","r",stdin);
freopen("maze.out","w",stdout);
in(n),in(m);
for(R int i=1,x,y,z;i<=m;i++)
{
in(x),in(y),in(z);
add(x,y,z);add(y,x,z);
}
spfa();
fclose(stdin);
fclose(stdout);
return 0;
}

NOIP2018提高组模拟题(二)的更多相关文章

  1. 2019.6.21 NOIP2018提高组模拟题(二)

    1.咒语 (curse.pas/c/cpp) [题目描述] 亮亮梦到自己来到了魔法城堡,但一扇巨大的石门阻拦了他通向城堡内的路.正当他沮丧之际,突然发现门上有一处机关,机关上有一张很长的纸条.亮亮拿起 ...

  2. 10.18 NOIP2018提高组模拟题(二)

    大水题 1.咒语 (curse.pas/c/cpp) [题目描述] 亮亮梦到自己来到了魔法城堡,但一扇巨大的石门阻拦了他通向城堡内的路.正当他沮丧之际,突然发现门上有一处机关,机关上有一张很长的纸条. ...

  3. NOIP2018提高组模拟题(四)

    能量(energy) Description ​ 有一块能量田,它的形状是 n*m的矩形,每一个格子上都有一个能量值 a[x][y] (可正可负).一块矩形田的能量定义为它的每个格子的能量值之和. ​ ...

  4. NOIP2018提高组模拟题(六)

    购物(shop) Description 小林来到商店中进行购物.商店里一共有 n 件物品,第 i 件物品的价格为 a[i] 元.小林总共需要购买 m 件物品,他希望他所花费的钱最少,请你计算出最小 ...

  5. NOIP2018提高组模拟题(五)

    字符串(string) Description 小林与亮亮正在做一个游戏.小林随意地写出一个字符串,字符串只由大写 字母组成,然后指定一个非负整数 m,亮亮可以进行至多 m 次操作,每次操作 为交换相 ...

  6. 11.5NOIP2018提高组模拟题

    书信(letter) Description 有 n 个小朋友, 编号为 1 到 n, 他们每人写了一封信, 放到了一个信箱里, 接下来每个人从中抽取一封书信. 显然, 这样一共有 n!种拿到书信的情 ...

  7. [JZOJ 5852] [NOIP2018提高组模拟9.6] 相交 解题报告 (倍增+LCA)

    题目链接: http://172.16.0.132/senior/#main/show/5852 题目: 题目大意: 多组询问,每次询问树上两条链是否相交 题解: 两条链相交并且仅当某一条链的两个端点 ...

  8. [JZOJ 5875] [NOIP2018提高组模拟9.20] 听我说,海蜗牛 解题报告(BFS+二分)

    题目链接: http://172.16.0.132/senior/#main/show/5875 题目: 题解: 注意这题只能经过开放的港口 我们考虑用vector存下每个点不能到的点,并把并让vec ...

  9. HGOI 20190822 OCWA提高组模拟赛二

    Problem A 快递 根节点为$1$ , 含有$n$个节点的树,每一条边都有一段开放的时间$[s_i,e_i]$,和经过需要的时间. 有$q$组询问,每一次在时刻$t_i$出发从根节点出发走到第$ ...

随机推荐

  1. 基于Python的selenuim自动化测试尝试

    工作这么多年了,终于狠下心好好开始学学自动化测试相关知识,揭开这层神秘的面纱. 困难重重,障碍很多,但好在每天都多少有点小收获. 很感谢一个QQ好友推荐的虫师,也非常感谢在这个契机读到了虫师编著的&l ...

  2. win 7 查看端口被占用

    开始---->运行---->cmd,或者是window+R组合键,调出命令窗口     输入命令:netstat -ano,列出所有端口的情况.在列表中我们观察被占用的端口,比如是4915 ...

  3. 【转载】Unity3D研究院之共享材质的巧妙用法(sharedMaterial效率问题)

    如果你需要修改模型材质的颜色,或者是修改材质Shader的一些属性, 通常情况是用获取模型的Renderer组件,然后获取它的material属性. 举个简单的例子,修改颜色或者直接更换shader ...

  4. GBDT(梯度提升树)scikit-klearn中的参数说明及简汇

    1.GBDT(梯度提升树)概述: GBDT是集成学习Boosting家族的成员,区别于Adaboosting.adaboosting是利用前一次迭代弱学习器的误差率来更新训练集的权重,在对更新权重后的 ...

  5. 一步步精通NodeJs的简单实例

    一步一步完成nodejs+express+mysql的简单实例开发 1.使用express创建简单web服务器 项目文件下安装express,这个不多说,很简单,直接在项目目录下运行 npm inst ...

  6. HDU 3111 Sudoku ( Dancing Links 精确覆盖模型 )

    推荐两篇学DLX的博文: http://bbs.9ria.com/thread-130295-1-1.html(这篇对DLX的工作过程演示的很详细) http://yzmduncan.iteye.co ...

  7. C# 命名管道

    有些场合需要高效率,进行线程间通信,可以使用 C#命名管道.

  8. 【bzoj4894】天赋 矩阵树定理

    题目描述 小明有许多潜在的天赋,他希望学习这些天赋来变得更强.正如许多游戏中一样,小明也有n种潜在的天赋,但有一些天赋必须是要有前置天赋才能够学习得到的.也就是说,有一些天赋必须是要在学习了另一个天赋 ...

  9. 雅礼集训 Day5 T3 题 解题报告

    题 题目背景 由于出题人赶时间所以没办法编故事来作为背景. 题目描述 一开始有\(n\)个苹果,\(m\)个人依次来吃苹果,第\(i\)个人会尝试吃\(u_i\)或\(v_i\)号苹果,具体来说分三种 ...

  10. pub/sub的实际应用总结

    pub/sub即观察者模式,有多重表现形式 1. Publisher/Subscriber2. Observer/Observable3. Listener(例如EventListener)4. Ev ...