zoukankan      html  css  js  c++  java
  • 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 } 
    View Code

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

    【题目描述】

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

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



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

    【输入格式】
       第一行,一串数字,表示从网上搜到的攻略。
       下面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('
    ');
     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 } 
    View Code

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

    【题目描述】

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

    【输入格式】

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

    【输出格式】

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

    【样例输入】

    2 2

    01

    10

    【样例输出】

    7

    【样例说明】

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

    【数据范围】

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

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

    100%的数据,1n≤1,000,000,0000m≤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 } 
    View Code

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

    详见BZOJ。

    暂时留着,以后再说

  • 相关阅读:
    Action返回类型
    低成本FPGA中实现动态相位调整
    SERDES高速系统(二)
    SERDES高速系统(一)
    Avalon总线概述
    FPGA热设计
    功耗的挑战
    特性阻抗介绍
    低阻抗电源分配系统
    非理想回路信号衰减
  • 原文地址:https://www.cnblogs.com/huibixiaoxing/p/7122974.html
Copyright © 2011-2022 走看看