• NOIP2008普及组 题解 -SilverN


    T1 ISBN号码

    题目描述

    每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符, 其规定格式如“x-xxx-xxxxx-x”,其中符号“-”就是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标 准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;第 二个分隔符后的五位数字代表该书在该出版社的编号;最后一位为识别码。

    识别码的计算方法如下:

    首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果mod 11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。例如ISBN号码0-670-82162-4中的识别码4是这样得到的:对 067082162这9个数字,从左至右,分别乘以1,2,...,9,再求和,即0×1+6×2+……+2×9=158,然后取158 mod 11的结果4作为识别码。

    你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出“Right”;如果错误,则输出你认为是正确的ISBN号码。

    输入输出格式

    输入格式:

    输入文件isbn.in只有一行,是一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。

    输出格式:

    输出文件isbn.out共一行,假如输入的ISBN号码的识别码正确,那么输出“Right”,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符“-”)。

    输入输出样例

    输入样例#1:
    【输入样例1】
    0-670-82162-4
    【输入样例2】
    0-670-82162-0
    输出样例#1:
    【输出样例1】
    Right
    【输出样例2】
    0-670-82162-4

    说明

    2008普及组第一题

     1 #include<iostream>
     2 #include<cstring>
     3 using namespace std;
     4 int main(){
     5     char a[15];
     6     int i=1,c=0;
     7     cin>>a;
     8     c=(a[0]-'0')*1+(a[2]-'0')*2+(a[3]-'0')*3+(a[4]-'0')*4+(a[6]-'0')*5+(a[7]-'0')*6+(a[8]-'0')*7+(a[9]-'0')*8+(a[10]-'0')*9;
     9     c%=11;
    10     if(c==10)
    11       if(a[12]=='X') cout<<"Right";
    12        else {
    13              for(i=0;i<=11;i++) cout<<a[i];
    14              cout<<"X";
    15                  }
    16      else if(a[12]-'0'==c) cout<<"Right";
    17        else{
    18              for(i=0;i<=11;i++) cout<<a[i];
    19              cout<<c;
    20        }
    21     return 0;
    22 }
    View Code

    用char串存号码,c[i]-'0'得到数字

    完全的模拟

    T2 排座椅

    题目描述

    上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小 雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课时会交头接耳。同学们在教室中坐成了M行N列,坐在第i行第j列的同学的位 置是(i,j),为了方便同学们进出,在教室中设置了K条横向的通道,L条纵向的通道。于是,聪明的小雪想到了一个办法,或许可以减少上课时学生交头接耳 的问题:她打算重新摆放桌椅,改变同学们桌椅间通道的位置,因为如果一条通道隔开了两个会交头接耳的同学,那么他们就不会交头接耳了。

    请你帮忙给小雪编写一个程序,给出最好的通道划分方案。在该方案下,上课时交头接耳的学生的对数最少。

    输入输出格式

    输入格式:

    输入文件seat.in的第一行,有5个用空格隔开的整数,分别是M,N,K,L,D(2<=N,M<=1000,0<=K<M,0<=L<N,D<=2000)。

    接下来的D行,每行有4个用空格隔开的整数。第i行的4个整数Xi,Yi,Pi,Qi,表示坐在位置(Xi,Yi)与(Pi,Qi)的两个同学会交头接耳(输入保证他们前后相邻或者左右相邻)。

    输入数据保证最优方案的唯一性。

    输出格式:

    输出文件seat.out共两行。

    第一行包含K个整数,a1,a2……aK,表示第a1行和a1+1行之间、第a2行和a2+1行之间、…、第aK行和第aK+1行之间要开辟通道,其中ai< ai+1,每两个整数之间用空格隔开(行尾没有空格)。

    第二行包含L个整数,b1,b2……bL,表示第b1列和b1+1列之间、第b2列和b2+1列之间、…、第bL列和第bL+1列之间要开辟通道,其中bi< bi+1,每两个整数之间用空格隔开(列尾没有空格)。

    输入输出样例

    输入样例#1:
    4 5 1 2 3
    4 2 4 3
    2 3 3 3
    2 5 2 4
    
    输出样例#1:
    2
    2 4
    

    说明

    上图中用符号*、※、+标出了3对会交头接耳的学生的位置,图中3条粗线的位置表示通道,图示的通道划分方案是唯一的最佳方案。

    2008年普及组第二题

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<cstring>
     5 #include<algorithm>
     6 using namespace std;
     7 struct td{
     8     int id;
     9     int num;
    10 };
    11 struct td x[1200],y[2100];
    12 int cmp(td a,td b){
    13     return a.num>b.num;
    14 }
    15 int rex[1200],rey[2100];
    16 int m,n,K,L,d;
    17 int main(){
    18     scanf("%d%d%d%d%d",&m,&n,&K,&L,&d);
    19     int i,j;
    20     int x1,y1,x2,y2;
    21     while(d--){
    22         scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
    23         if(y1!=y2){
    24             int mi=min(y1,y2);
    25             y[mi].num++;
    26             y[mi].id=mi;
    27         }
    28         if(x1!=x2){
    29             int mi=min(x1,x2);
    30             x[mi].num++;
    31             x[mi].id=mi;
    32         }
    33     }
    34     sort(x+1,x+m+1,cmp);
    35     sort(y+1,y+n+1,cmp);
    36     for(i=1;i<=K && i<=m;i++){
    37         rex[i]=x[i].id;
    38     }
    39     for(i=1;i<=L && i<=n;i++){
    40         rey[i]=y[i].id;
    41     }
    42     sort(rex+1,rex+K+1);
    43     sort(rey+1,rey+L+1);
    44     for(i=1;i<=K;i++)printf("%d ",rex[i]);
    45     cout<<endl;
    46     for(i=1;i<=L;i++)printf("%d ",rey[i]);
    47     return 0;
    48 }
    View Code


    两次排序,一次排能隔开的数量,一次排ID

    看发帖时间就知道我为何不想多解释

    T3

    题目描述

    上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着同学们一起做传球游戏。

    游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师在此吹哨子时,传球停止,此时,拿着球没有传出去的那个同学就是败者,要给大家表演一个节目。

    聪明的小蛮提出一个有趣的问题:有多少种不同的传球方法可以使得从小蛮手里开始传的球,传了m次以后,又回到小蛮手里。两种传球方法被视作不同的方 法,当且仅当这两种方法中,接到球的同学按接球顺序组成的序列是不同的。比如有三个同学1号、2号、3号,并假设小蛮为1号,球传了3次回到小蛮手里的方 式有1->2->3->1和1->3->2->1,共2种。

    输入输出格式

    输入格式:

    输入文件ball.in共一行,有两个用空格隔开的整数n,m(3<=n<=30,1<=m<=30)。

    输出格式:

    输出文件ball.out共一行,有一个整数,表示符合题意的方法数。

    输入输出样例

    输入样例#1:
    3 3
    输出样例#1:
    2

    说明

    40%的数据满足:3<=n<=30,1<=m<=20

    100%的数据满足:3<=n<=30,1<=m<=30

    2008普及组第三题

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<algorithm>
     5 using namespace std;
     6 int n;
     7 int f[200][200];//[第i次][第j个人]
     8 int t;
     9 int main(){
    10     cin>>n>>t;
    11     int i,j;
    12     f[0][1]=1;//球刚开始在1号手里 
    13     for(i=1;i<=t;i++)
    14       for(j=1;j<=n;j++){
    15           f[i][j%n]=f[i-1][(j-1)%n]+f[i-1][(j+1)%n];
    16 //          for(int k=0;k<=n;k++)printf("%d ",f[i][k]);
    17       }
    18     printf("%d",f[t][1]);
    19     return 0;
    20 }
    View Code

    动规,f[次数][人员]

    每次可以从左边的人或右边的人手里接到球,所以方案数是左右相加

    注意链变环

    T4 立体图

    题目描述

    小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容。最近,他准备给小朋友们讲解立体图,请你帮他画出立体图。

    小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每个格子上堆了一些同样大小的积木(积木的长宽高都是1),小渊想请你打印出这些格子的立体图。我们定义每个积木为如下格式,并且不会做任何翻转旋转,只会严格以这一种形式摆放:

    每个顶点用1个加号’+’表示,长用3个”-”表示,宽用1个”/”,高用两个”|”表示。字符’+’,”-”,”/”,”|”的ASCII码分别 为43,45,47,124。字符’.’(ASCII码46)需要作为背景输出,即立体图里的空白部分需要用’.’来代替。立体图的画法如下面的规则:

    若两块积木左右相邻,图示为:

    若两块积木上下相邻,图示为:

    若两块积木前后相邻,图示为:

    立体图中,定义位于第(m,1)的格子(即第m行第1列的格子)上面自底向上的第一块积木(即最下面的一块积木)的左下角顶点为整张图最左下角的点。

    输入输出格式

    输入格式:

    输入文件drawing.in第一行有用空格隔开的2个整数m和n,表示有m*n个格子(1<=m,n<=50)。

    接下来的m行,是一个m*n的矩阵,每行有n个用空格隔开的整数,其中第i行第j列上的整数表示第i行第j列的个子上摞有多少个积木(1<=每个格子上的积木数<=100)。

    输出格式:

    输出文件drawing.out中包含题目要求的立体图,是一个K行L列的字符串矩阵,其中K和L表示最少需要K行L列才能按规定输出立体图。

    输入输出样例

    输入样例#1:
    3 4
    2 2 1 2
    2 2 1 1
    3 2 1 2
    
    输出样例#1:
    ......+---+---+...+---+
    ..+---+  /   /|../   /|
    ./   /|-+---+ |.+---+ |
    +---+ |/   /| +-|   | +
    |   | +---+ |/+---+ |/|
    |   |/   /| +/   /|-+ |
    +---+---+ |/+---+ |/| +
    |   |   | +-|   | + |/.
    |   |   |/  |   |-| +..
    +---+---+---+---+ |/...
    |   |   |   |   | +....
    |   |   |   |   |/.....
    +---+---+---+---+......

    说明

    NOIP2008普及组第四题

    本质上还是模拟,但是算坐标让题目复杂度上了一级

    不习惯夜战的我算错了好几次……

     1 /*SilverN 2008普及组T4立体图*/
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<cstring>
     5 #include<cmath>
     6 #include<algorithm>
     7 using namespace std;
     8 char c[7][8]={//立体图
     9 "..+---+",
    10 "./   /|",
    11 "+---+ |",
    12 "|   | +",
    13 "|   |/.",
    14 "+---+.."};
    15 char map[2000][2000];
    16 int d[2000][2000];
    17 int K,L;
    18 void draw(int x,int y){//按左上角坐标定位  
    19     int i,j;
    20     for(i=0;i<=5;i++)
    21      for(j=0;j<=6;j++){
    22        if(map[x+i][y+j]!='.' && c[i][j]=='.')continue;//以前画过,就不用点来覆盖了 
    23        map[x+i][y+j]=c[i][j];
    24     }
    25     return;
    26 }
    27 int main(){
    28     int i,j;
    29     int m,n;//行数,列数 
    30     scanf("%d%d",&m,&n);
    31     for(i=1;i<=m;i++)
    32      for(j=1;j<=n;j++){
    33         scanf("%d",&d[i][j]);
    34         K=max(K,2*(m-i+1)+d[i][j]*3+1);
    35 //2*(m-i+1)是由于矩阵宽而多需要的高度,d[i][j]*3+1是因为积木数量而需要的高度 
    36     }
    37     L=4*n+2*m+1;//4*n是由于矩阵宽而多需要的宽度,2*m+1是因为积木前后层数而需要的高度
    38     for(i=1;i<=K;i++)
    39      for(j=1;j<=L;j++)
    40        map[i][j]='.';//先铺好点 
    41     for(i=1;i<=m;i++)//从后往前 
    42       for(j=1;j<=n;j++)//从左往右 
    43         for(int g=0;g<d[i][j];g++)//从下往上
    44             {
    45           draw(K-2*(m-i)-3*(g+2)+1,4*j+2*(m-1-i)-1);//这坐标算得心累 
    46           }
    47     for(i=1;i<=K;i++){//输出 
    48      for(j=1;j<=L;j++)
    49        putchar(map[i][j]);
    50        printf("
    ");
    51        }
    52     return 0;
    53 }
    View Code

    解释都在注释里了

    那个用char组表示立体图的方法是和别的大神学的

    很帅对吧

  • 相关阅读:
    创建自定义 AJAX 客户端控件(msdn)
    使用jquery的blockui插件显示弹出层
    Sql Server高手必备
    Js获取当前日期时间及其它操作
    在VS2010中创建自定义的代码段
    存储过程分页
    完美辨析各种高度区别
    程序员必备的正则表达式
    Sql日期格式化
    C#调用Quartz实例代码
  • 原文地址:https://www.cnblogs.com/SBSOI/p/5575011.html
Copyright © 2020-2023  润新知