NOIP模拟赛20161023


题目名


双色球


魔方


czy的后宫


mex


源文件


ball.cpp/c/pas


cube.cpp/c/pas


harem.cpp/c/pas


mex.cpp/c/pas


输入文件


ball.in


cube.in


harem.in


mex.in


输出文件


ball.out


cube.out


harem.out


mex.out


时间限制


1000MS


1000MS


1500MS


1000MS


内存限制


256MB


256MB


256MB


256MB


测试点


10


10


10


10


测试点分值


10


10


10


10



Problem 1 双色球(ball.cpp/c/pas)

【题目描述】

机房来了新一届的学弟学妹,邪恶的chenzeyu97发现一位学弟与他同名,于是他当起了善良的学长233

“来来来,学弟,我考你道水题检验一下你的水平……”

一个栈内初始有n个红色和蓝色的小球,请你按照以下规则进行操作

  1. 只要栈顶的小球是红色的,将其取出,直到栈顶的球是蓝色
  2. 然后将栈顶的蓝球变成红色
  3. 最后放入若干个蓝球直到栈中的球数为n

以上3步骤为一次操作

如栈中都是红色球,则操作停止,请问几次操作后停止

chenzeyu97出完题发现他自己不能AC所以想请你帮忙

【输入格式】

第一行为一个整数n,表示栈的容量为n

第二行为一个字符串,第i个字符表示自顶向下的第i个球的颜色,R代表红色,B代表蓝色

【输出格式】

一个整数表示操作数

【样例输入】

样例1:

3

RBR

样例2:

4

RBBR

【样例输出】

样例1:2

样例2:6

【数据范围】

50%的数据,1<=n<=20

100%的数据,1<=n<=50



模拟,复杂度好像会爆炸

发现一个蓝色变成红色,它前面必须全是红色

考虑全蓝色的情况f[i]=2*f[i-1]+1,就是汉诺塔

这样从前往后扫,每个蓝色带来的操作数就是f[i]-f[i-1](因为前面已经是红色了,一个f[i-1]不用了)

PS:灰哥的找规律做法,每个位置变蓝的操作数1,2,4,8,16.........

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=55;
typedef long long ll;
inline int read(){
    char c=getchar();int x=0,f=1;
    while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();}
    return x*f;
}
int n,a[N],p=0;
ll f[N];
char s[N];
int main(int argc, const char * argv[]){
    freopen("ball.in","r",stdin);
    freopen("ball.out","w",stdout);

    n=read();
    scanf("%s",s+1);
    for(int i=1;i<=n;i++) a[i]= s[i]==‘R‘?1:0;
    for(int i=1;i<=n;i++) f[i]=2*f[i-1]+1;
    ll ans=0;
    for(int i=1;i<=n;i++)
        if(a[i]==0) ans+=f[i]-f[i-1];
    printf("%lld",ans);
}




Problem 2 魔方(cube.cpp/c/pas)

【题目描述】

ccy(ndsf)觉得手动复原魔方太慢了,所以他要借助计算机。

ccy(ndsf)家的魔方都是3*3*3的三阶魔方,大家应该都见过。

3的“顺时针”改为“逆时针”,即3 4以图为准。)
ccy(ndfs)从网上搜了一篇攻略,并找人翻译成了他自己会做的方法。现在告诉你他的魔方情况,以及他从网上搜到的攻略,请你求出最后魔方变成什么样子。

【输入格式】
   第一行,一串数字,表示从网上搜到的攻略。
   下面6*3行,每行3个数字,每三行表示魔方一个面的情况,六个面的顺序是前、后、左、右、上、下。

【输出格式】
   6*3行,表示处理后的魔方,形式同输入。

【样例输入】

23
121
221
111
123
321
111
123
321
132
132
231
132
121
112
233
332
111
333

【样例输出】

123
222
113
212
321
113
122
321
132
121
333
121
211
312
113
331
111
331

【样例解释】

【数据范围】

40%的数据,攻略的长度小于5且仅有4种操作的其中一种

100%的数据,攻略的长度小于100



大模拟

注意每个图的方向很奇葩,参考样例

样例和数据有点问题,顶部的顺时针和逆时针旋转颠倒了,按着错误来就过了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=105;
typedef long long ll;
inline int read(){
    char c=getchar();int x=0,f=1;
    while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();}
    return x*f;
}
int n,s[N],a[7][4][4],b[4];
char tmp[N],t[7][4][4];
void cpy(int x[4][4],int y[4][4]){
    for(int i=1;i<=3;i++)
        for(int j=1;j<=3;j++) y[i][j]=x[i][j];
}
void rot(int p,int d){//1 shun  2 ni
    int na[4][4];
    cpy(a[p],na);
    if(d==1){
        for(int i=1;i<=3;i++)    b[i]=na[1][i];
        for(int i=1;i<=3;i++)    a[p][1][i]=na[3-i+1][1];
        for(int i=1;i<=3;i++)    a[p][i][1]=na[3][i];
        for(int i=1;i<=3;i++)    a[p][3][i]=na[3-i+1][3];
        for(int i=1;i<=3;i++)    a[p][i][3]=b[i];
    }else{
        for(int i=1;i<=3;i++)    b[i]=na[1][i];
        for(int i=1;i<=3;i++)    a[p][1][i]=na[i][3];
        for(int i=1;i<=3;i++)    a[p][i][3]=na[3][3-i+1];
        for(int i=1;i<=3;i++)    a[p][3][i]=na[i][1];
        for(int i=1;i<=3;i++)    a[p][i][1]=b[3-i+1];
    }
}
void sol(int flag){
    if(flag==1){
        for(int i=1;i<=3;i++){
            b[i]=a[1][i][3];
            a[1][i][3]=a[6][i][3];
            a[6][i][3]=a[2][i][3];
            a[2][i][3]=a[5][i][3];
            a[5][i][3]=b[i];
        }
        rot(4,1);
    }else if(flag==2){
        for(int i=1;i<=3;i++){
            b[i]=a[1][i][3];
            a[1][i][3]=a[5][i][3];
            a[5][i][3]=a[2][i][3];
            a[2][i][3]=a[6][i][3];
            a[6][i][3]=b[i];
        }
        rot(4,2);
    }else if(flag==3){
        for(int i=1;i<=3;i++){
            b[i]=a[1][1][i];
            a[1][1][i]=a[3][1][i];
            a[3][1][i]=a[2][1][i];
            a[2][1][i]=a[4][1][i];
            a[4][1][i]=b[i];
        }
        //rot(5,2); right
        rot(5,1);
    }else if(flag==4){
        for(int i=1;i<=3;i++){
            b[i]=a[1][1][i];
            a[1][1][i]=a[4][1][i];
            a[4][1][i]=a[2][1][i];
            a[2][1][i]=a[3][1][i];
            a[3][1][i]=b[i];
        }
        //rot(5,1); right
        rot(5,2);
    }

//    for(int i=1;i<=6;i++)
//        for(int j=1;j<=3;j++){
//            for(int k=1;k<=3;k++)
//                printf("%d",a[i][j][k]);
//            putchar(‘\n‘);
//        }
//        printf("\n\n\n");
}
int main(int argc, const char * argv[]){
    freopen("cube.in","r",stdin);
    freopen("cube.out","w",stdout);
    scanf("%s",tmp+1);
    int n=strlen(tmp+1);
    for(int i=1;i<=n;i++) s[i]=tmp[i]-‘0‘;
    for(int i=1;i<=6;i++)
        for(int j=1;j<=3;j++){
            scanf("%s",t[i][j]+1);
            int len=strlen(t[i][j]+1);
            for(int k=1;k<=len;k++) a[i][j][k]=t[i][j][k]-‘0‘;
        }
    for(int i=1;i<=n;i++) sol(s[i]);
    for(int i=1;i<=6;i++)
        for(int j=1;j<=3;j++){
            for(int k=1;k<=3;k++)
                printf("%d",a[i][j][k]);
            putchar(‘\n‘);
        }

}




Problem 3 czy的后宫(harem.cpp/c/pas)

【题目描述】

czy要妥善安排他的后宫,他想在机房摆一群妹子,一共有n个位置排成一排,每个位置可以摆妹子也可以不摆妹子。有些类型妹子如果摆在相邻的位置(隔着一个空的位置不算相邻),就不好看了。假定每种妹子数量无限,求摆妹子的方案数。

【输入格式】

输入有m+1行,第一行有两个用空格隔开的正整数n、m,m表示妹子的种类数。接下来的m行,每行有m个字符1或0,若第i行第j列为1,则表示第i种妹子第j种妹子不能排在相邻的位置,输入保证对称。(提示:同一种妹子可能不能排在相邻位置)。

【输出格式】

输出只有一个整数,为方案数(这个数字可能很大,请输出方案数除以1000000007的余数。

【样例输入】

2 2

01

10

【样例输出】

7

【样例说明】

七种方案为(空,空)、(空,1)、(1、空)、(2、空)、(空、2)、(1,1)、(2,2)。

【数据范围】

20%的数据,1<n≤5,0<m≤10。

60%的数据,1<n≤200,0<m≤100。

100%的数据,1<n≤1000000000,0<m≤100。



一眼看出正解:矩阵乘法加速DP

然后已忘记矩阵乘法

就打了个裸DP加滚动数组加卡常,还是60

f[i][j]前i个mz以j结尾

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int M=105,MOD=1000000007;
typedef long long ll;
inline int read(){
    char c=getchar();int x=0,f=1;
    while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();}
    return x*f;
}
int n,m,g[M][M];
ll f[2][M],p=0;
char s[M];
inline void mod(ll &x){if(x>=MOD) x-=MOD;}
void dp(){
    for(int j=0;j<=m;j++) f[p][j]=1;
    for(int i=2;i<=n;i++){
        p^=1;
        for(int j=0;j<=m;j++){
            f[p][j]=0;
            for(int k=0;k<=m;k++) if(g[j][k]){
                f[p][j]+=f[p^1][k];
                mod(f[p][j]);
            }
        }
    }
}

int main(int argc, const char * argv[]){
    freopen("harem.in","r",stdin);
    freopen("harem.out","w",stdout);

    n=read();m=read();
    for(int i=1;i<=m;i++){
        scanf("%s",s+1);
        for(int j=1;j<=m;j++) g[i][j]=(s[j]-‘0‘)^1;
    }
    for(int i=0;i<=m;i++) g[i][0]=g[0][i]=1;
    dp();
    ll ans=0;
    for(int i=0;i<=m;i++) ans=(ans+f[p][i])%MOD;
    printf("%lld",ans);

} 

正解先开个坑





mex

我靠不是bzoj那道嘛

果断30分暴力

时间: 2024-10-25 04:50:22

NOIP模拟赛20161023的相关文章

【简单思考】noip模拟赛 NTR酋长

NTR酋长 (ntr.pas/.c/.cpp) 黄巨大终于如愿以偿的进入了czy的后宫中……但是czy很生气……他要在黄巨大走到他面前的必经之路上放上几个NTR酋长来阻挡黄巨大. 众所周知,NTR酋长有一个技能是沟壑(F).它会在地图上产生一条长长的障碍物阻挡人前进.Czy打算在一个n*m的矩形(必经之路?)中放上NTR酋长.NTR酋长要一个一个放下去,而且每放一个都会向四角倾斜的方向放出无限长的沟壑,而已经被沟壑挡住的地方就不能再放NTR酋长了. 请注意:不会出现沟壑的路径挡住另一个沟壑的情况

【noip模拟赛】 射击

这题似乎是什么安阳一中的模拟题,不管了,反正是学长出的noip模拟赛里面的题目.... 射击(shoot.pas/.c/.cpp) 时间限制:1s,内存限制128MB 题目描述: 据史书记载,对越反击战时期,有位中国侦察兵,他的代号叫814.一天他执行狙击任务,他的任务地区是n座恰巧在一条直线上的山.这些山所在直线恰巧为东西走向,山从东到西依次编号为1~n.一天814隐藏在编号为k的山上,每座山上都有1个目标. 814也非常的厉害,任务结束时杀了很多人,可是史书中只记载了两点: 1:814一定攻

NOIP模拟赛

#1[Nescafé 31]杯NOIP模拟赛 t1 题意:n*m的棋盘上从(1,1)走到(n,m),只能向下或向右,一些格子有老鼠,每个老鼠互不相同,当处于与老鼠有重边的格子时,视为看见了这只老鼠,求到终点看到最少的不同老鼠数. 分析:DP 由于求得是看到的不同的老鼠数目,不能直接用过河卒做,因为同一个位置的老鼠可能会统计多次,我们还需要增加一维即方向. f[i,j,0]表示到从上面一个格子走到(i,j)时最少老鼠数,f[i,j,1]表示左边. f[i,j,0]:=min(f[i-1,j,0]+

NOIP模拟赛 6.29

2017-6-29 NOIP模拟赛 Problem 1 机器人(robot.cpp/c/pas) [题目描述] 早苗入手了最新的Gundam模型.最新款自然有着与以往不同的功能,那就是它能够自动行走,厉害吧. 早苗的新模型可以按照输入的命令进行移动,命令包括‘E’.‘S’.‘W’.‘N’四种,分别对应东南西北.执行某个命令时,它会向对应方向移动一个单位.作为新型机器人,它可以执行命令串.对于输入的命令串,每一秒它会按命令行动一次.执行完命令串的最后一个命令后,会自动从头开始循环.在0时刻时机器人

2012-10-20 NOIP模拟赛

      2012-10-20 NOIP模拟赛 by coolyangzc 共3道题目,时间3小时 题目名 高级打字机 不等数列 经营与开发 源文件 type.cpp/c/pas num.cpp/c/pas exploit.cpp/c/pas 输入文件 type.in num.in exploit.in 输出文件 type.out num.out exploit.out 时间限制 1000MS 1000MS 1000MS 内存限制 256MB 256MB 256MB 测试点 5+(5) 10

2017 9 11 noip模拟赛T2

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=205; int map[N][N]; int d[N],tag[N],book[N],f[N]; int n,m; void work(int x) { memset(d,63,sizeof(d)); memset(book,0,sizeof(book)); memset(f,0,sizeof(

【noip模拟赛4】Matrix67的派对 暴力dfs

[noip模拟赛4]Matrix67的派对 描述 Matrix67发现身高接近的人似乎更合得来.Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们安排在圆桌上.Matrix67的安排原则是,圆桌上任意两个相邻人的身高之差不能超过K.请告诉Matrix67他共有多少种安排方法. 输入 第一行输入两个用空格隔开的数N和K,其中1<=N<=10,1<=K<=1 000 000. 第二行到第N+1行每行输入一个人的身高值.所有人的身高都是不

2014-11-3 NOIP模拟赛2

NOIP 2014 水题模拟赛 (请选手务必仔细阅读本页内容) 一.题目概况 中文题目名称 数列 刷漆 排队 英文题目与子目录名 seq paint layout 可执行文件名 seq paint layout 输入文件名 seq.in paint.in layout.in 输出文件名 seq.out paint.out layout.out 每个测试点时限 2 秒 1 秒 1 秒 测试点数目 10 10 10 每个测试点分值 10 10 10 附加样例文件 无 无 无 结果比较方式 全文比较(

2014-9-9 NOIP模拟赛

东方幻想乡系列模拟赛Stage 1命题 Nettle审题 Barty ccy1991911 FlanS39 Wagner T2 高精除高精,从来没写过,不知道怎么写,我就用大数减小数ans次,果断超时. T4 Tarjan的板子题,好久没写,中间出现了一些小错误 ①是尽管有双向边,Tarjan函数中也不必排除双向边 ②Tarjan算法有时候不能一步完成,需要做最多n次,用循环解决 ③问题是关于这个题目的虽然输入n代表有n个点,但是下面的连边中有些点根本没出现过,所以设一个数组记录有效点. Pro