NOIP模拟 7.05

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

【题解】

定义cnt[i]表示连续i个蓝色球需要的移动次数,不难得到cnt[i] = 2cnt[i - 1] + 1

我用了大整数。。结果不需要。。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <algorithm>
 6 const int INF = 0x3f3f3f3f;
 7 const int MAXN = 50 + 10;
 8
 9 inline void read(long long &x)
10 {
11     x = 0;char ch = getchar();char c = ch;
12     while(ch < ‘0‘ || ch > ‘9‘)c = ch, ch = getchar();
13     while(ch <= ‘9‘ && ch >= ‘0‘)x = x * 10 + ch - ‘0‘, ch = getchar();
14     if(c == ‘-‘)x = -x;
15 }
16
17 struct Bignum
18 {
19     long long data[1000000],len;
20     void add(long long x)
21     {
22         int tmp = 1;
23         data[1] += x;
24         while(data[tmp] >= 10)
25         {
26             data[tmp + 1] += data[tmp] / 10;
27             data[tmp] = data[tmp] % 10;
28             tmp ++;
29         }
30         if(tmp > len) len = tmp;
31     }
32     void put()
33     {
34         for(int i = len;i >= 1;-- i)
35         {
36             printf("%d", data[i]);
37         }
38     }
39 };
40
41 long long n;char s[MAXN];
42 long long blue[MAXN], top;
43 long long cnt[MAXN];
44
45 Bignum ans;
46
47 int main()
48 {
49     cnt[1] = 1;
50     for(int i = 1;i <= 60;++ i)
51         cnt[i] = (cnt[i - 1] << 1) + 1;
52     read(n);
53     register int i;
54     scanf("%s", s + 1);
55     for(i = 1;i <= n;++ i)
56         if(s[i] == ‘B‘)
57             blue[++top] = i;
58     memset(ans.data, 0, sizeof(ans.data));
59     ans.len = 1;
60     while(top)
61         ans.add(cnt[blue[top] - 1] + 1), top --;
62     ans.put();
63     return 0;
64 } 

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

【题解】

题目样例数据均有误,只能按错的做了。暴力。

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <cstdlib>
  5 #include <algorithm>
  6 const int INF = 0x3f3f3f3f;
  7 const int MAXN = 100 + 10;
  8
  9 inline void read(int &x)
 10 {
 11     x = 0;char ch = getchar();char c = ch;
 12     while(ch < ‘0‘ || ch > ‘9‘)c = ch, ch = getchar();
 13     while(ch <= ‘9‘ && ch >= ‘0‘)x = x * 10 + ch - ‘0‘, ch = getchar();
 14     if(c == ‘-‘)x = -x;
 15 }
 16 inline void swap(int &a, int &b){int tmp = a;a = b;b = tmp;}
 17
 18 int q[MAXN],n;
 19 int squ[10][5][5];
 20 int tmp[5],tmp2[5][5];
 21
 22 inline void put()
 23 {
 24     for(int i = 1;i <= 6;++ i)
 25     {
 26         for(int j = 1;j <= 3;++ j)
 27         {
 28             for(int k = 1;k <= 3;++ k)
 29                 printf("%d", squ[i][j][k]);
 30             putchar(‘\n‘);
 31         }
 32     }
 33 }
 34
 35 int main()
 36 {
 37     char c = getchar();
 38     while(c > ‘9‘ || c < ‘0‘)c = getchar();
 39     while(c <= ‘9‘ && c >= ‘0‘)q[++n] = c - ‘0‘,c = getchar();
 40     for(int i = 1;i <= 6;++ i)
 41     {
 42         for(int j = 1;j <= 3;++ j)
 43         {
 44             while(c > ‘9‘ || c < ‘0‘)c = getchar();
 45             for(int k = 1;k <= 3;++ k)
 46             {
 47                 squ[i][j][k] = c - ‘0‘;
 48                 c = getchar();
 49             }
 50         }
 51     }
 52     for(int k = 1;k <= n;++ k)
 53     {
 54         if(q[k] == 1)
 55         {
 56             //5上最右->2后最右
 57             //1前最右->5上最右
 58             //6下最右->1前最右
 59             //2后最右->6下最右
 60             //4右面 顺时针转90度
 61             for(int i = 1;i <= 3;++ i)
 62                 tmp[i] = squ[2][i][3];
 63             for(int i = 1;i <= 3;++ i)
 64                 squ[2][i][3] = squ[5][i][3];
 65             for(int i = 1;i <= 3;++ i)
 66                 squ[5][i][3] = squ[1][i][3];
 67             for(int i = 1;i <= 3;++ i)
 68                 squ[1][i][3] = squ[6][i][3];
 69             for(int i = 1;i <= 3;++ i)
 70                 squ[6][i][3] = tmp[i];
 71
 72             for(int i = 1;i <= 3;++ i)
 73                 for(int j = 1;j <= 3;++ j)
 74                     tmp2[i][j] = squ[4][i][j];
 75             for(int i = 1;i <= 3;++ i)
 76                 for(int j = 1;j <= 3;++ j)
 77                     squ[4][i][j] = tmp2[3 - j + 1][i];
 78         }
 79         else if(q[k] == 2)
 80         {
 81             //5上最右->1前最右
 82             //2后最右->5上最右
 83             //6下最右->2后最右
 84             //1前最右->6下最右
 85             //4右面 逆时针转90度
 86
 87             for(int i = 1;i <= 3;++ i)
 88                 tmp[i] = squ[1][i][3];
 89             for(int i = 1;i <= 3;++ i)
 90                 squ[1][i][3] = squ[5][i][3];
 91             for(int i = 1;i <= 3;++ i)
 92                 squ[5][i][3] = squ[2][i][3];
 93             for(int i = 1;i <= 3;++ i)
 94                 squ[2][i][3] = squ[6][i][3];
 95             for(int i = 1;i <= 3;++ i)
 96                 squ[6][i][3] = tmp[i];
 97
 98             for(int i = 1;i <= 3;++ i)
 99                 for(int j = 1;j <= 3;++ j)
100                     tmp2[i][j] = squ[4][i][j];
101             for(int i = 1;i <= 3;++ i)
102                 for(int j = 1;j <= 3;++ j)
103                     squ[4][i][j] = tmp2[j][3 - i + 1];
104         }
105         else if(q[k] == 3)
106         {
107             //1前最上->4右最上
108             //3左最上->1前最上
109             //2后最上->3左最上
110             //4右最上->2后最上
111             //5上逆时针
112             for(int i = 1;i <= 3;++ i)
113                 tmp[i] = squ[4][1][i];
114             for(int i = 1;i <= 3;++ i)
115                 squ[4][1][i] = squ[1][1][i];
116             for(int i = 1;i <= 3;++ i)
117                 squ[1][1][i] = squ[3][1][i];
118             for(int i = 1;i <= 3;++ i)
119                 squ[3][1][i] =  squ[2][1][i];
120             for(int i = 1;i <= 3;++ i)
121                 squ[2][1][i] = tmp[i];
122             for(int i = 1;i <= 3;++ i)
123                 for(int j = 1;j <= 3;++ j)
124                     tmp2[i][j] = squ[5][i][j];
125             for(int i = 1;i <= 3;++ i)
126                 for(int j = 1;j <= 3;++ j)
127                     squ[5][i][j] = tmp2[3 - j + 1][i];
128
129         }
130         else
131         {
132             //1前最上->3左最上
133             //4右最上->1前最上
134             //2后最上->4右最上
135             //3左最上->2后最上
136             //5上顺时针
137             for(int i = 1;i <= 3;++ i)
138                 tmp[i] = squ[3][1][i];
139             for(int i = 1;i <= 3;++ i)
140                 squ[3][1][i] = squ[1][1][i];
141             for(int i = 1;i <= 3;++ i)
142                 squ[1][1][i] = squ[4][1][i];
143             for(int i = 1;i <= 3;++ i)
144                 squ[4][1][i] =  squ[2][1][i];
145             for(int i = 1;i <= 3;++ i)
146                 squ[2][1][i] = tmp[i];
147             for(int i = 1;i <= 3;++ i)
148                 for(int j = 1;j <= 3;++ j)
149                     tmp2[i][j] = squ[5][i][j];
150             for(int i = 1;i <= 3;++ i)
151                 for(int j = 1;j <= 3;++ j)
152                     squ[5][i][j] = tmp2[j][3 - i + 1];
153
154         }
155     }
156     put();
157     return 0;
158 } 

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≤1,000,000,000,0<m≤100。

注:此题时限1.5s是因为本评测机跑太慢,大家正常做

但写的太丑可能T一俩个点

【题解】

f[i][j]表示前i个妹子(包括0)最后一个是j的方案数;

f[i][j] = fΣ[i - 1][k]

矩阵加速

现场读入写挂了只拿了10分。。

险些AK

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <cstdlib>
  5 #include <algorithm>
  6 const long long INF = 0x3f3f3f3f3f3f3f3f;
  7 const long long MAXN = 1000000000 + 10;
  8 const long long MAXM = 1000 +10;
  9 const long long MOD = 1000000007;
 10 inline void read(long long &x)
 11 {
 12     x = 0;char ch = getchar();char c = ch;
 13     while(ch < ‘0‘ || ch > ‘9‘)c = ch, ch = getchar();
 14     while(ch <= ‘9‘ && ch >= ‘0‘)x = x * 10 + ch - ‘0‘, ch = getchar();
 15     if(c == ‘-‘)x = -x;
 16 }
 17
 18 long long n,m;
 19 long long g[MAXM][MAXM];
 20 long long tmp[MAXM][MAXM];
 21 long long ans[MAXM][MAXM];
 22 long long base[MAXM][MAXM];
 23 void pow(long long b)
 24 {
 25     register long long i,j,k;
 26     //int r = 1;
 27     for(i = 1;i <= m;++ i)
 28         ans[i][i] = 1;
 29     //int base = a;
 30     for(i = 1;i <= m;++ i)
 31         for(j = 1;j <= m;++ j)
 32             base[i][j] = g[i][j];
 33     while(b)
 34     {
 35         if(b & 1)
 36         {
 37             memset(tmp, 0, sizeof(tmp));
 38             //r *= base;
 39             for(k = 1;k <= m;++ k)
 40                 for(i = 1;i <= m;++ i)
 41                     for(j = 1;j <= m;++ j)
 42                     {
 43                         tmp[i][j] += ((ans[i][k] * base[k][j]) % MOD);
 44                         while(tmp[i][j] >= MOD)
 45                             tmp[i][j] -= MOD;
 46                     }
 47             for(i = 1;i <= m;++ i)
 48                 for(j = 1;j <= m;++ j)
 49                     ans[i][j] = tmp[i][j];
 50         }
 51         memset(tmp, 0, sizeof(tmp));
 52         //base *= base;
 53         for(k = 1;k <= m;++ k)
 54             for(i = 1;i <= m;++ i)
 55                 for(j = 1;j <= m;++ j)
 56                 {
 57                     tmp[i][j] += ((base[i][k] * base[k][j]) % MOD);
 58                     while(tmp[i][j] >= MOD)
 59                         tmp[i][j] -= MOD;
 60                 }
 61         for(i = 1;i <= m;++ i)
 62             for(j = 1;j <= m;++ j)
 63                 base[i][j] = tmp[i][j];
 64         b >>= 1;
 65     }
 66 }
 67
 68 int main()
 69 {
 70     read(n);read(m);
 71     register long long i,j;
 72     register char c;
 73     register long long as = 0;
 74     for(i = 1;i <= m;++ i)
 75     {
 76         while(c > ‘9‘ || c < ‘0‘)c = getchar();
 77         for(int j = 1;j <= m;++ j)
 78         {
 79             g[i][j] = c - ‘0‘;
 80             g[i][j] ^= 1;
 81             c = getchar();
 82         }
 83     }
 84     m ++;
 85     for(i = 1;i <= m;++ i)
 86         g[m][i] = g[i][m] = 1;
 87     pow(n - 1);
 88     as = 0;
 89     for(i = 1;i <= m;++ i)
 90         for(j = 1;j <= m;++ j)
 91         {
 92             as += ans[i][j] % MOD;
 93             while(as >= MOD)
 94                 as -= MOD;
 95         }
 96     if(as < 0)as += MOD;
 97     if(n == 1)printf("%lld", n + 1);
 98     else printf("%lld", as % MOD);
 99     return 0;
100 } 

Problem 4 mex(mex.cpp/c/pas)

详见BZOJ。

暂时留着,以后再说

时间: 2024-11-10 00:52:07

NOIP模拟 7.05的相关文章

ZROI提高组模拟赛05总结

ZROI提高组模拟赛05总结 感觉是目前为止最简单的模拟赛了吧 但是依旧不尽人意... T1 有一半的人在30min前就A掉了 而我花了1h11min 就是一个简单的背包,我硬是转化了模型想了好久,生生把一个弱智题变成了一个不可做题 最后竟然在转化两次后的模型上以为自己做出来了 这个题比别人多花的1h左右的时间,而且只得到了30分,成为了这场比赛失败的关键因素 T2 依旧是一道简单题 有人20min之内就A掉了 感觉放在CF里最多算一道Div2 D,还是简单的那种 可是我又一次想复杂了 大意就是

NOIP模拟17.8.17

NOIP模拟17.8.17 A 小 G 的字符串文件名 输入文件 输出文件 时间限制 空间限制str.pas/c/cpp str.in str.out 1s 128MB[题目描述]有一天,小 L 给小 G 出了这样一道题:生成一个长度为 n 的.全由小写英文字母构成的字符串,只能使用 k 种字母.要求满足:• 字符串中相邻的两个字母不能相同.• 必须出现恰好 k 种不同的字母.这样的合法字符串可能有很多,小 L 让小 G 输出字典序最小的那个.小 G 太笨啦,不会做这道题,希望你帮帮他.[输入格

[BZOJ入门OJ2092][Noip模拟题]舞会

2092: [Noip模拟题]舞会 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 9  Solved: 5 [Submit][Status][Web Board] Description 学校举行舞会啦,一共有N个人参加,所有人站成一排,从左开始编号,最左边的人编号为1 ,最右边的为N.每个人跳舞的熟练度我们用一个整数表示,第i个人的熟练度为Ai,每次熟 练度最接近的一对相邻男女会出列跳舞,如果有多对那么最左边的那一对会先出列,请你给 出出列跳

【简单思考】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模拟 17.8.18

NOIP模拟17.8.18 A.小菜一碟的背包[题目描述]Blice和阿强巴是好朋友但萌萌哒Blice不擅长数学,所以阿强巴给了她一些奶牛做练习阿强巴有 n头奶牛,每头奶牛每天可以产一定量的奶,同时也需要一定量的草作为饲料对于第 i头奶牛来说,它每天可以产 vi升的奶,同时需要 wi千克的草作为饲料现在来自蚯蚓国的九条可怜想借一些奶牛,使借走的这些奶牛每天的总产奶量最大,但九条可怜很穷,每天最多只能提供W千克的草作为饲料,而且她还需要对付跳蚤国的神刀手,所以她把这个问题交给了阿强巴,不不不……阿

NOIP模拟 6.28

NOIP模拟赛6.28 Problem 1 高级打字机(type.cpp/c/pas) [题目描述] 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序,支持如下3种操作: 1.T x:在文章末尾打下一个小写字母x.(type操作) 2.U x:撤销最后的x次修改操作.(Undo操作) (注意Query操作并不算修改操作) 3.Q x:询问当前文章中第x个字母并输出.(Query操作) 文章一开始可以视为空串. [输入格式]

NOIP模拟17.9.21

NOIP模拟17.9.21 1 任务安排manage.in/.out/.cpp1.1 问题描述你有N 个工作,同一时刻只能做一个任务, 其中每个工作有其所需时间, 及完成的Deadline(截止时间), 问要完成所有工作, 最迟要从什么时候开始.你最早可以从时间0 开始工作.1.2 输入格式第一行一个整数N,表示任务数量接下来n 行,每行两个整数,Ti; Si,分别表示该任务的持续时间和截止时间.1.3 输出格式输出一个整数,表示最晚的开始时间,如果不能完成,输出-1.1.4 样例输入43 58