zoukankan      html  css  js  c++  java
  • 程设刷题 | 程序设计实践II-2017(部分)

    目录

    1165-算术题

    题目描述

    代码实现

    1184-Tourist 1

    题目描述

    代码实现

    1186-Tourist 2

    题目描述

    代码实现

    1224-LOVE

    题目描述

    代码实现

    1256-湘潭大学

    题目描述

    代码实现

    1253-Robot

    题目描述

    代码实现

    1227-Robot

    题目描述

    代码实现

    1228-Hash

    题目描述

    代码输入

    1252-Matrix Word

    题目描述

    代码实现

    1246-Matrix Transposition

    题目描述

    代码实现

    Z字形

    题目描述

    代码实现

    环形N阶字母矩阵

    题目描述

    代码实现

    1238-Binary String

    题目描述

    思路

    代码实现

    1168-填颜色

    题目描述

    分析

    代码实现

    1176-First Blood

    题目描述

    代码实现

    119-Balloon2

    题目描述

    代码实现

    1193-Eason

    题目描述

    代码实现

    1214-A+B IV

    题目描述

    代码实现

    1218-A+B VIII

    题目描述

    代码实现 / C

    代码实现 / JAVA

    1243-Bob's Password

    题目描述

    代码实现


    1165-算术题

    题目描述

    小明在做加减法的算术题,有些题他不会做,那么他会不填答案,有些题可能做错了。 请你写个程序,判断一下小明作对了几道题?
    输入
    每行一个算术式,形如a+b=c,a-b=c,a+b=,a-b=。0≤a,b,c≤100
    输出
    输出正确的题目数。


    样例输入
    1+1=2
    1+2=4
    2-1=1
    2-2=
    3+6=
    样例输出
    2

    代码实现

    #include<bits/stdc++.h>
    using namespace std;
    
    char s[50];
    
    int main(){
        int d1,d2,d3;
        int cnt=0;
        char op;
        while(gets(s)){
            d3=1000;
            sscanf(s,"%d%c%d=%d",&d1,&op,&d2,&d3);
            //printf("%d %d %d
    ",d1,d2,d3);
            if(d1+d2==d3&&op=='+')
            {
                cnt++;
            }
            if(d1-d2==d3&&op=='-')
            {
                cnt++;
            }
        }
        printf("%d
    ",cnt);
        return 0;
    }

    1184-Tourist 1

    题目描述

    Eric喜欢旅行,今年暑假终于可以有几天时间出去玩了。他计划在去3个不同的城市,而且不想重复去相同的城市,
    最后回到出发的城市,他想知道怎么走可以让差旅费用降到最低? 我们把城市编号为0~3,Eric总从0号城市出发。

    输入
    第一行是一个整数K,表示样例的个数。 每个样例占4行,每行4个整数Xij,第i行第j列个整数表示从城市i到城市j所需要的旅费,
    单次费用不超过1000。i = j 时,Xij = 0。
    输出
    每行输出一个样例的结果,包括两行,第一行是差旅的总费用,第二行是3个城市的编号序列,
    每个城市编号之间用一个空格隔开,表示旅行的路线,如果存在多条线路都是最少花费,请输出字典序输出这些线路,每个线路一行。


    样例输入
    1
    0 1 1 1
    2 0 2 2
    3 3 0 3
    4 4 4 0
    样例输出
    10
    1 2 3
    1 3 2
    2 1 3
    2 3 1
    3 1 2
    3 2 1

    代码实现

    #include<bits/stdc++.h>
    using namespace std;
    
    int main()
    {
        int K;
        scanf("%d",&K);
        while(K--)
        {
            int s[4][4];
            for(int i=0; i<4; i++)
            {
                for(int j=0; j<4; j++)
                {
                    scanf("%d",&s[i][j]);
                }
            }
            int min=10000;
            int cnt,sum,m[30][3];
            //接下来的这个多层循环很核心
            for(int i=1; i<4; i++)
            {
                for(int j=1; j<4; j++)
                {
                    if(i==j) continue;
                    for(int k=1; k<4; k++)
                    {
                        if(i==k||j==k) continue;
                        sum=s[0][i]+s[i][j]+s[j][k]+s[k][0];
                        if(sum>min)continue;
                        if(sum<min)//第一次判断一定会经过这儿(而且一旦经过这儿,注意里面cnt=0;这句相当重要)
                        {
                            min=sum;
                            cnt=0;
                            m[cnt][0]=i;
                            m[cnt][1]=j;
                            m[cnt][2]=k;
                            cnt++;
                        }
                        else if(sum==min)//不用担心这个值不是最小值却将它也记录了下来(那是因为如果能跑到这里,说明上面的那个sum<min没满足,那么至少在到目前的比较中,这的确是当前最小的)
                        {
                            m[cnt][0]=i;
                            m[cnt][1]=j;
                            m[cnt][2]=k;
                            cnt++;
                        }
                    }
                }
            }
            printf("%d
    ",min);
            for(int i=0;i<cnt;i++)//这儿的cnt最终取值取决于哪里要清楚
            {
                for(int j=0;j<3;j++)
                {
                    printf("%d",m[i][j]);
                    if(j<2) printf(" ");
                }
                printf("
    ");
            }
        }
        return 0;
    }

    1186-Tourist 2

    题目描述

    求n位01串含连续至少2个1的串的个数。

    输入

    第一行是一个整数K(K≤10000),表示样例的个数。 每行样例是一个整数n(1≤1000000)。

    输出

    每行输出一个样例的结果,因为数目可能很大,请对109+7取模。

    样例输入

    5
    1
    2
    3
    4
    1000000
    样例输出
    0
    1
    3
    8
    782550144

    代码实现

    #include <bits/stdc++.h>
    using namespace std;
    int g[10][10], ans, T, path[111], p[10], pid, vis[10], n;
    void dfs(int i, int cnt, int cost) {
        if(cnt == n) {
            if(cost+g[i][0] < ans) {
                ans = cost + g[i][0];
                pid = 0;
                for(int j = 0; j < n; j++) path[pid++] = p[j];
            } else if(cost+g[i][0] == ans && pid < n*10) for(int j = 0; j < n; j++) path[pid++] = p[j];
            return;
        }
        for(int j = 1; j <= n; j++) {
            if(!vis[j]) {
                vis[j] = true;
                p[cnt] = j;
                dfs(j, cnt+1, cost+g[i][j]);
                vis[j] = false;
            }
        }
    }
    int main() {
        scanf("%d", &T);
        while(T--) {
            scanf("%d", &n);
            for(int i = 0; i <= n; i++) for(int j = 0; j <= n; j++) scanf("%d", &g[i][j]);
            ans = 11111, pid = 0;
            memset(vis, false, sizeof(vis));
            dfs(0,0,0);
            printf("%d
    ", ans);
            pid = min(pid, n*10);
            for(int i = 0; i < pid; i += n) {
                for(int j = i; j < i+n; j++) {
                    if(j%n) putchar(' ');
                    printf("%d", path[j]);
                }
                puts("");
            }
        }
        return 0;
    }

    1224-LOVE

    题目描述

    给你一个字符串,求存在多少个子序列为"LOVE"? 所谓串的子序列即序列(xi,xj,xk,xt), 假设串共有n个字符,那么1≤i<j<k<t≤n。
    输入
    第一行是一个整数K(K≤1000),表示样例的个数。 以后每行一个字符串,字符串只含英文大写字母,长度不超过1000个字符。
    输出
    每个样例输出一行,因为这个值可能非常大,将结果对1000000007取模。


    样例输入
    4
    LOVE
    LOVA
    LLOOVVEE
    LOVELOVE
    样例输出
    1
    0
    16
    5

    代码实现

    #include <bits/stdc++.h>
    int main() {
        int T;
        scanf("%d ", &T);
        while(T--) {
            char s[1001];
            gets(s);
            int f[4] = {0}, len = strlen(s);
            for(int i = 0; i < len; i++) {
                if(s[i] == 'L') f[0]++;
                if(s[i] == 'O') f[1] += f[0];
                if(s[i] == 'V') f[2] += f[1];
                if(s[i] == 'E') f[3] += f[2];
            }
            printf("%d
    ", f[3]%1000000007);
        }
    }

    1256-湘潭大学

    题目描述

    湘潭大学简称“XTU”,作为即将成为湘大的一份子,怎么不能为湘大添砖加瓦了?
    现在给你一个字符串,请你计算一下,从中选取字符,最多能组成多少个“XTU”?
    输入
    第一行是一个整数K,表示样例的个数。 以后每行一个字符串,字符串只包含英文大写字母,长度不会超过1000。
    输出
    每行输出一个样例的结果。


    样例输入
    3
    XTUUTX
    ABCDEFGHIJKLMNOPQRSTUVWXTZ
    XXXTTT
    样例输出
    2
    1
    0
     

    代码实现

    #include<bits/stdc++.h>
    using namespace std;
    
    int main()
    {
        int K;
        int x,t,u,res;
        scanf("%d",&K);
        char str[1010];
        while(K--)
        {
            scanf("%s",str);
            x=0,t=0,u=0;
            for(int i=0; i<strlen(str); i++)
            {
                if(str[i] == 'X') x++;
                if(str[i] == 'T') t++;
                if(str[i] == 'U') u++;
            }
            //printf("%d %d %d
    ",x,t,u);
            int tt=x<t?x:t;
            res=tt<u?tt:u;
            printf("%d
    ",res);
        }
        return 0;
    }

    1253-Robot

    题目描述

    有N 个任务需要Robot去完成,这个N个任务的地点在一个数轴上,坐标为1 到n 。每个任务需要先完成a i  个任务才能开始去做。Robot可以在直线上左右移动,初始位置位于任务1 的地点,方向朝向数轴正方向。请问Robot最少转换多少次方向可以完成所有的任务。

    输入
    存在多个样例。每个样例的第一行是一个整数n(1≤n≤1000) ,第二行是一个n 个整数a 1 ,a 2 ,⋯,a n (0≤a i <n) 。 输入数据保证一定能完成任务。

    输出

    每行输出一个样例的结果


    样例输入
    3
    0 2 0
    7
    0 3 1 0 5 2 6
    样例输出
    1
    2

    代码实现

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
    
        int n,a[1010],aa,res;
        bool flag[1010];
        while(~scanf("%d",&n)){
            for(int i=0;i<n;i++) scanf("%d",&a[i]);
            memset(flag,0,sizeof(flag));
            aa = 0;
            res  = 0;
            while(aa != n){
                for(int i=0;i<n;i++){
                    if(aa >= a[i] && !flag[i]){
                        aa++;
                        flag[i] = true;
                    }
                }
                if(aa == n) break;
                else res++;
                for(int i=n-1;i>=0;i--){
                    if(aa >= a[i] && !flag[i]){
                        aa++;
                        flag[i] = true;
                    }
                }
                if(aa == n) break;
                else res++;
            }
            printf("%d
    ",res);
        }
        return 0;
    }
    

    1227-Robot

    题目描述

    假设在一个XOY坐标的平面上,机器人一开始位于原点,面向Y轴正方向。 机器人可以执行向左转,向右转,向后转,前进四个指令。 指令为
    •LEFT:向左转
    •RIGHT:向右转
    •BACK:向后转
    •FORWORD n:向前走n(1≤n≤100)个单位
    现在给你一个指令序列,求机器人最终的位置。

    输入

    样例的第一行是一个整数T(T≤20),表示样例的个数。 每个样例的第一行是一个整数N(1≤N≤1,000),表示指令的条数。 以后的N行,每行一条指令。

    输出
    每个样例输出两个整数,为坐标(x,y),之间用空格隔开。


    样例输入
    2
    4
    LEFT
    FORWORD 1
    RIGHT
    FORWORD 1
    2
    BACK
    FORWORD 1
    样例输出
    -1 1
    0 -1
     

    代码实现

    #include<bits/stdc++.h>
    
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            int N;
            scanf("%d",&N);
            getchar();
            int x=0,y=0;
            int ix=0,iy=1;
            char order[10];
            for(int i=0;i<N;i++)
            {
                scanf("%s",order);
                if(order[0]=='L')
                {
                    if(ix==0&&iy==1)
                    {
                        ix=-1;
                        iy=0;
                    }
                    else if(ix==-1&&iy==0)
                    {
                        ix=0;
                        iy=-1;
                    }
                    else if(ix==0&&iy==-1)
                    {
                        ix=1;
                        iy=0;
                    }
                    else if(ix==1&&iy==0)
                    {
                        ix=0;
                        iy=1;
                    }
                }
                else if(order[0]=='R')
                {
                    if(ix==0&&iy==1)
                    {
                        ix=1;
                        iy=0;
                    }
                    else if(ix==1&&iy==0)
                    {
                        ix=0;
                        iy=-1;
                    }
                    else if(ix==0&&iy==-1)
                    {
                        ix=-1;
                        iy=0;
                    }
                    else if(ix==-1&&iy==0)
                    {
                        ix=0;
                        iy=1;
                    }
                }
                else if(order[0]=='B')
                {
                    if(ix==0&&iy==1)
                    {
                        ix=0;
                        iy=-1;
                    }
                    else if(ix==0&&iy==-1)
                    {
                        ix=0;
                        iy=1;
                    }
                    else if(ix==1&&iy==0)
                    {
                        ix=-1;
                        iy=0;
                    }
                    else if(ix==-1&&iy==0)
                    {
                        ix=1;
                        iy=0;
                    }
                }
                else if(order[0]=='F')
                {
                    int num;
                    scanf("%d",&num);
                    getchar();
                    x += num*ix;
                    y += num*iy;
                }
            }
            printf("%d %d
    ",x,y);
        }
        return 0;
    }

    1228-Hash

    题目描述

    平方取中是常用的一种整数Hash函数,对于整数x,计算x*x,然后取数码串的中间4位作为hash值。
     算法如下:
    1. s = x*x
    2. 如果s位数为奇数,则在之前补0
    3. 如果s数码不足4位的,取s,否则取s数码的中间4位组成的10进制整数作为hash值。
    现给x,请计算hash(x)。
    输入
    每行一个正整数x,(x ≤ 109)。
    输出
    依次输出对应x的hash值。

    样例输入
    1
    10
    100
    1000
    样例输出
    1
    100
    1000
    0
     

    代码输入

    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    int main(){
        __int64 x;
        __int64 num[4];
        while(~scanf("%I64d",&x)){
            __int64 s = x*x;
            __int64 ss= s;
            //printf("%I64d
    ",s);
            int digit = 0;
            while(ss){
                ss /= 10;
                digit++;
            }
            //printf("%d
    ",digit);
            if(digit&1) digit++;
            if(digit<=4) printf("%I64d
    ",s);
            else {
                digit /= 2;
                ss = s;
                for(int i=0;i<digit-2;i++) ss/=10;
                for(int i=0;i<4;i++){
                    num[i] = ss%10;
                    ss /= 10;
                }
                __int64 ans = 0;
                for(int i=3,tmp=1000;i>=0;i--,tmp/=10){
                    ans += num[i]*tmp;
                }
                printf("%I64d
    ",ans);
            }
        }
        return 0;
    }

    1252-Matrix Word

    题目描述

    一个n×m 的矩阵,矩阵每个元素是一个小写英文字母,如果某个字母所在行或者列不是唯一的,那么我们就删掉这个字符。
    最后,我们按矩阵的从上到下,从左到右,可以得到一个单词。比如,矩阵为
    abb
    bca
    acb
    我们可以发现只有第二行的b和a是所在行和列唯一的,所以最后的单词为ba。
    输入
    存在多个输入样例,每个样例的第一行是两个整数n 和m (1≤n,m≤100) 。
     以后是一个n×m 的矩阵,矩阵每个元素一个小写英文字母。
     输入数据保证结果不为空。
    输出
    每行输出一个样例的结果。

     

    代码实现

    #include<bits/stdc++.h>
    char mat[101][101];
    int n, m;
    bool judge(int i, int j,char c)
    {
        for(int k = 0; k < m; k++)
            if(mat[i][k] == c && k != j) return true;
        for(int k = 0; k < n; k++)
            if(mat[k][j] == c && k != i) return true;
        return false;
    }
    int main()
    {
        while(~scanf("%d %d ", &n, &m))
        {
            for(int i = 0; i < n; i++)
            {
                for(int j = 0; j < m; j++)
                {
                    mat[i][j]=getchar();
                }
                getchar();
            }
            for(int i = 0; i < n; i++)
            {
                for(int j = 0; j < m; j++)
                {
                    if(!judge(i, j, mat[i][j])) putchar(mat[i][j]);
                }
            }
            printf("
    ");
        }
    }

    1246-Matrix Transposition

    题目描述

    输入
    第一行是一个整数T,(0<T≤10) ,表示样例的数目。
    每个样例的第一行是三个整数N,M,K,1≤N,M≤1000,1≤K≤10000 ,分别表示矩阵的行数,列数,非零元素个数。
    以后的K行,每行三个整数X,Y,V,0≤X<N,0≤Y<M,−100≤V≤100 ,表示元素的行,列,值。
    数据保证输入元素的顺序按行优先有序。

    输出
    输出每个样例的结果,每个样例输出之后有一个空行。


    样例输入
    2
    3 3 3
    0 1 1
    1 1 2
    1 2 3
    1 3 1
    0 0 1
    样例输出
    1 0 1
    1 1 2
    2 1 3

    0 0 1
     

    代码实现

    #include<bits/stdc++.h>
    using namespace std;
    
    struct matrix
    {
        int col;
        int row;
        int data;
    }mat[10001],res[10001];
    
    
    void change(struct matrix a[],struct matrix b[],int N,int m)
    {
        int i,j,t=0;
        for(i = 0; i <m; i++)
        {
            for(j = 0; j <N; j++)
            {
                if(a[j].col==i)
                {
                    b[t].row = a[j].col;
                    b[t].col = a[j].row;
                    b[t].data = a[j].data;
                    t++;
                }
            }
        }
    }
    int main()
    {
        int T,i;
        scanf("%d",&T);
        while(T--)
        {
            int n,m,k;
            scanf("%d %d %d",&n,&m,&k);
            for(i=0; i<k; i++)
            {
                scanf("%d %d %d",&mat[i].row,&mat[i].col,&mat[i].data);
            }
            change(mat,res,k,m);
            for(i=0; i<k; i++)
            {
                printf("%d %d %d
    ",res[i].row, res[i].col, res[i].data);
            }
            printf("
    ");
        }
        return 0;
    }

    Z字形

    题目描述

    给一个由英文大写字母组成的字符串,串长为n*n(0<n<11),请将这个按Z字形排列输出这个字符方阵。比如: ABCDEFGHI,Z字形排成一个3*3的方阵如下:

    A B F

    C EG

    D H I

    输入
    每行一个字符串。

    输出

    输出对应矩阵,每个矩阵之后有一个空行。


    Sample Input
    ABCDEFGHI
    AAAABBBBCCCCDDDD
    Sample Output
    ABF
    CEG
    DHI

    AABB
    ABBD
    ACCD
    CCDD

    代码实现

    #include<bits/stdc++.h>
    using namespace std;
    
    #define N 11
    int i,j;
    int k;
    int ln;
    int n;
    char s[N*N];
    char a[N][N];
    void go_right()
    {
        j++;
    }
    void go_left()
    {
        j--;
    }
    void go_down()
    {
        i++;
    }
    void go_up()
    {
        i--;
    };
    void left_down()
    {
        go_left();
        go_down();
    }
    void right_up()
    {
        go_right();
        go_up();
    }
    void go()
    {
        while(1)
        {
            if(j+1 < n)
            {
                go_right();
                a[i][j] = s[k];
                k++;//右移
                if(k == ln +1) return;
            }
            else
            {
                go_down();
                a[i][j] = s[k];
                k++;
                if(k == ln +1) return;
            }
    
    
            while(1) //左下移动
            {
                left_down();
                if(j >= 0 && i< n)
                {
                    a[i][j]=s[k];
                    k++;
                    if(k == ln +1) return;
                }
                else break;
            }
            j++;
            i--;//还原一步
    
    
            if(i+1 < n)
            {
                go_down();
                a[i][j] = s[k];
                k++;//向下
                if(k == ln +1) return;
            }
            else
            {
                go_right();
                a[i][j] = s[k];
                k++;//右移
                if(k == ln +1) return;
            }
    
    
            while(1) //右上移动
            {
                right_up();
                if(i>=0 && j<n)
                {
                    a[i][j]=s[k];
                    k++;
                    if(k == ln +1) return;
                }
                else break;
            }
            i++;
            j--;//还原一步
        }
    }
    void print()
    {
        i=j=0;
        for(i=0; i<n; i++)
        {
            for(j=0; j<n; j++)
                printf("%c",a[i][j]);
            printf("
    ");
        }
    }
    void Z(char s[])
    {
        ln = strlen(s);
        n = (int)sqrt(ln);
        k=0;
        i=j=0;
        a[i][j] = s[k];
        k++;
        go();
        print();
        return;
    }
    int main()
    {
        while(scanf("%s",s) != EOF)
        {
            Z(s);
        }
        return 0;
    }

    环形N阶字母矩阵

    题目描述

    给定 N,输出一个 N*N 的矩阵,矩阵为 N 层,每层是一个字符,从
    A 到 Z。比如说 N=3,矩阵为
    CCCCC
    CBBBC
    CBABC
    CBBBC
    CCCCC

    输入
    第一行是一个整数 K( K≤ 50),表示样例数。每个样例占 1 行,为一
    个整数 N( 1≤ N≤ 26)。
    输出
    每个样例输出对应的矩阵,行尾没有多余的空格。

    代码实现

    #include<bits/stdc++.h>
    
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            int K;
            scanf("%d",&K);
            char str[2*K-1][2*K-1];
            for(int i=0; i<2*K-1; i++)
            {
                for(int j=0; j<2*K-1; j++)
                {
                    str[i][j]='A'+K-1;
                }
            }
            for(int m=1; m<K; m++)
            {
                int tt,temp=m;
                for(int i=temp,tt=K-1; i<=2*tt-m; i++)
                {
                    for(int j=m; j<=2*tt-m; j++)
                    {
                        str[i][j]='A'+K-1-m;
                    }
                }
            }
            for(int i=0; i<2*K-1; i++)
            {
                for(int j=0; j<2*K-1; j++)
                {
                    printf("%c",str[i][j]);
                }
                printf("
    ");
            }
        }
        return 0;
    }

    1238-Binary String

    题目描述

    求n位01串含连续至少2个1的串的个数。
    输入
    第一行是一个整数K(K≤10000),表示样例的个数。 每行样例是一个整数n(1≤1000000)。
    输出
    每行输出一个样例的结果,因为数目可能很大,请对109+7取模。


    样例输入
    5
    1
    2
    3
    4
    1000000
    样例输出
    0
    1
    3
    8
    782550144

    思路

    递推。考虑i位时,设f[i]为结果,那么显然可知,i位是在i-1位的基础上,由最高位加0和加1形成,
    加0结果就为f[i-1],加1分两种情况:

    • 一种是i-1位的最高位为0,结果显然是f[i-2];
    • 另一种是最高位为1,那么加1肯定至少有两个1连续,结果必为i-1位二进制总数的一半,即2^(i-2)。

    所以得到递推式f[i]=f[i-1]+f[i-2]+2^(i-2)。先预处理一下,然后直接输出即可(节约时间)。

    代码实现

    #include <bits/stdc++.h>
    using namespace std;
    
    #define maxn 1000005
    #define mod 1000000007
    long long f[maxn], dp[maxn];
    int n;
    void init(){
        dp[1] = 1;
        for (int i=2; i<maxn; i++)
            dp[i] = 2*dp[i-1]%mod;
        f[1] = 0;
        f[2] = 1;
        for (int i=3; i<maxn; i++)
            f[i] = (f[i-1]+f[i-2]+dp[i-1])%mod;
    }
    int main(){
        init();
        int T;
        cin >> T;
        while (T--){
            cin >> n;
            cout << f[n] << endl;
        }
        return 0;
    }
    

    1168-填颜色

    题目描述

    给你n个方格,m种颜色,要求相邻格和首尾格的颜色不同,请问有多少种不同的填涂方法。
    输入
    每行输出两个整数n和m,1≤n,m≤1,000。
    输出
    每行输出一个样例的结果,由于可能会很大,最后结果对1000003取模。


    样例输入
    1 1
    1 2
    3 2
    1000 10
    样例输出
    1
    2
    0
    566585

    分析

    当n<=3时我们要特殊处理一下。
    当n>3时,我们发现要考虑的情况有两种:

    • 当倒数第二个格子样式和第一个格子样式相同时。
    • 当倒数第二个格子样式和第一个格子样式不同时。

    代码实现

    #include <cstdio>
    const int MOD = 1000003;
    long long f[1111], n, m;
    int main() {
        while(scanf("%I64d %I64d",&n, &m) != EOF) {
            f[1] = m;
            f[2] = m * (m-1) % MOD;
            f[3] = f[2] * (m-2) % MOD;
            for(int i = 4; i <= n; i++) f[i] = (f[i-1] * (m-2) % MOD + f[i-2] * (m-1) % MOD) % MOD;
            printf("%I64d
    ", f[n]);
        }
    }

    1176-First Blood

    题目描述

    ICPC比赛中,某道题的第一次正确提交,被称为First Blood。现给你一个提交的日志文件,请计算出所有题目的First Blood情况。
    输入
    样例的第一行是一个整数N,表示比赛题目的总数(1≤N≤16)。 以后每行是一条日志信息,包含提交的时间,格式为小时:分钟:秒, 提交队伍号,题目的题号(从1001开始),判题结果。 判题结果为“Accepted”为正确提交,其他都为错误提交。如果有多个队伍同时刻正确提交同一道题,以出现在前的队伍为准。
    输出按题目顺序,每行输出一个题的First Blood情况,包含题号, First Blood的时间,提交的队伍号。如果没人正确提交,则只需要输出题号。

    样例输入
    3
    00:35:10 Team001 1001 Wrong Answer
    00:55:20 Team002 1002 Runtime Error
    00:56:21 Team003 1002 Time Limit Error
    01:06:22 Team001 1001 Accepted
    01:26:56 Team002 1001 Accepted
    02:08:10 Team003 1001 Wrong Answer
    02:10:33 Team003 1001 Accepted
    02:20:10 Team001 1002 Time Limit Error
    02:40:20 Team003 1003 Accepted
    02:42:52 Team002 1002 Accepted
    02:50:35 Team003 1002 Runtime Error
    02:51:48 Team003 1002 Accepted
    样例输出
    1001 01:06:22 Team001
    1002 02:42:52 Team002
    1003 02:40:20 Team003

    代码实现

    #include<bits/stdc++.h>
    int main()
    {
        int N,flag[100];
        scanf("%d",&N);
        getchar();
        char _time[10][10],_name[10][10];
        char time[10],name[10],res[20];
        int num;
        char c;
        memset(flag,0,sizeof(flag));
        while(scanf("%s %s %d %s",time,name,&num,res)!=EOF)
        {
            while((c=getchar())!='
    ')
            {
                num-=1000;
                if(strcmp(res,"Accepted")==0)
                {
                    if(flag[num]==0||strcmp(time,_time[num])<0)
                    {
                        flag[num]=1;
                        strcpy(_name[num],name);
                        strcpy(_time[num],time);
                    }
                }
            }
        }
        for(int i=1; i<=N; i++)
        {
            if(flag[i]==0)
                printf("%d
    ",i+1000);
            else
                printf("%d %s %s
    ",i+1000,_time[i],_name[i]);
        }
        return 0;
    }

     

    119-Balloon2

    题目描述

    ICPC比赛当你过了一道题以后,会发一个标识这道题颜色的气球。 现给你2个队过的气球的颜色,求他们都过了的气球是哪些?
    输入
    第一行是一个整数K,表示样例的个数(K≤100)。 每个样例的第一行是两个整数N和M,1≤N,M≤100000,表示两个队分别过题的数量;
    第二、三行分别是N和M个有序的整数Xi和Yi,0≤Xi,Yi≤109,表示气球的颜色。 输入数据保证集合{Xi}和{Yi}的元素都是唯一的,
    且两个集合一定存在交集。
    输出
    每个样例输出两行,第一行输出相同的过题数目S,第二行按升序输出S个整数,每个整数之间空一个空格。


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

    代码实现

    #include<bits/stdc++.h>
    using namespace std;
    
    int main()
    {
        int K;
        scanf("%d",&K);
        int N,M,n[100001],m[100001],res[100001];
        while(K--)
        {
            scanf("%d %d",&N,&M);
            for(int i=0; i<N; i++)
            {
                scanf("%d",&n[i]);
            }
            for(int j=0; j<M; j++)
            {
                scanf("%d",&m[j]);
            }
            sort(n,n+N);
            sort(m,m+M);
            int i=0,j=0,cnt=0;
            while(i<N&&j<M)
            {
                if(n[i]==m[j])
                {
                    res[cnt]=n[i];
                    i++;
                    j++;
                    cnt++;
                }
                else if(n[i]>m[j])
                {
                    j++;
                }
                else
                {
                    i++;
                }
            }
            printf("%d
    ",cnt);
            sort(res,res+cnt);
            for(i=0; i<cnt; i++)
            {
                printf("%d",res[i]);
                if(i<cnt-1) printf(" ");
            }
            printf("
    ");
        }
        return 0;
    }

    1193-Eason

    题目描述

    Eason是个非常迷信的人,他喜欢数字3和6,不喜欢4和7。 如果一个数字的数码中没有4和7,而有3或者6的话,他就会喜欢这个数字。
    比如,他会喜欢13,36,但是不会喜欢14,34。但对于28这种的,他就无所谓喜欢还是不喜欢。
    Eason想知道区间[a,b]中一共有多少个他喜欢和不喜欢的数字?
    输入
    每行输入一个样例,为a和b,0≤a≤b≤106。如果a和b都为0,那么输入结束,这个样例不需要处理。
    输出
    每行输出一个样例的结果,先输出喜欢数字的个数,再输出不喜欢数字的个数。


    样例输入
    1 10
    1 100
    1 1000000
    0 0
    样例输出
    2 2
    28 36
    215488 737856

    代码实现

    #include<bits/stdc++.h>
    
    using namespace std;
    #define N 1000000
    int likes[1000010], dlikes[1000010];
    int check(int x)
    {
        int flag = 0;
        while(x)
        {
            int xx = x%10;
            x /= 10;
            if(xx == 4||xx==7) return 2;
            if(xx == 3||xx==6) flag = 1;
        }
        return flag;
    }
    int main()
    {
        int a,b,i;
        for(i=1; i<=N; i++)
        {
            int x = check(i);
            if(x == 1) likes[i] = likes[i-1]+1;
            else likes[i] = likes[i-1];
            if(x == 2) dlikes[i] = dlikes[i-1]+1;
            else dlikes[i] = dlikes[i-1];
        }
        while(~scanf("%d%d",&a,&b))
        {
            if(a==0 && b==0) break;
            int x = check(a);
            if(x == 1)
            {
                printf("%d %d
    ",likes[b]-likes[a]+1,dlikes[b]-dlikes[a]);
            }
            else if(x == 2)
            {
                printf("%d %d
    ",likes[b]-likes[a], dlikes[b]-dlikes[a]+1);
            }
            else
            {
                printf("%d %d
    ",likes[b]-likes[a],dlikes[b]-dlikes[a]);
            }
        }
        return 0;
    }
    

    1214-A+B IV

    题目描述

    小明喜欢做a+b的算术,但是他经常忘记把末位对齐,再进行加,所以,经常会算错。 比如12+13,他把12左移了1位,结果变成了133。
    小明已经算了一些等式,请计算一下他到底移动了多少位。

    输入
    第一行是一个整数K,表示样例的个数。 以后每行一个样例,形如a+b=c, 1≤a,b≤1e4;0≤c≤1e9。
    输出
    每行输出一个样例的结果,以b为标准,a如果往左移n位,输出n,如果往右移n位,输出-n。
    测试数据保证一定有解,如果存在多个解,输出左移的结果。


    样例输入
    6
    12+13=1213
    12+13=1312
    12+13=25
    12+13=12013
    12+13=133
    12+13=142
    样例输出
    2
    -2
    0
    3
    1
    -1

    代码实现

    #include<bits/stdc++.h>
    using namespace std;
    
    int main()
    {
        int K;
        scanf("%d",&K);
        while(K--)
        {
            int a,b,c;
            int cnt=0;
            int temp;
            scanf("%d+%d=%d",&a,&b,&c);
            if(a+b==c) printf("0
    ");
            else
            {
                //printf("%d
    ",temp);
                for(temp=1; (b+a*temp!=c)&&(a+b*temp!=c); temp*=10)
                {
                    cnt++;
                }
                //printf("%d
    ",temp);
                if((b+a*temp)==c)
                    printf("%d
    ",cnt);
                else
                    printf("-%d
    ",cnt);
            }
        }
        return 0;
    }

    1218-A+B VIII

    题目描述

    小明一天在做a+b时,突然他想知道a+b能被哪些数整除了?比如说2+4=6,能整除6的数有1,2,3,6,一共4个。
    请你帮他算一下,a+b的和能被几个数整除。
    输入
    第一行是一个整数K,表示样例的个数。 每个样例占一行,为两个整数a,b,(1≤a,b≤1e9)。
    输出
    每行输出一个样例的结果,为一个整数。


    样例输入
    2
    2 3
    4 2
    样例输出
    2
    4
     

    代码实现 / C

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main()
    {
        int k;
        int n,count,i,j,q;
            k=1;
            scanf("%d %d",&x,&y);
            n = x + y;
            for (i=2; i*i<=n; i++)
            {
                if (n%i==0)
                {
                    count = 1;
                    while (n%i==0)
                    {
                        n /= i;
                        count++;
                    }
                    k *= count;
                    if (n==1) break;
                }
            }
            if (n!=1) k *= 2;
            printf("%d
    ",k);
        }
        return 0;
    }

    代码实现 / JAVA

    import java.util.Scanner;
    public class Main {
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            int K = in.nextInt();
            while ((K--) != 0) {
                int i, a, b, cnt = 2, sum;
                a = in.nextInt();
                b = in.nextInt();
                sum = a + b;
                for (i = 2; i * i <= sum; i++) {
                    if (sum % i == 0)
                        if (i * i == sum)
                            cnt += 1;
                        else
                            cnt += 2;
                }
                System.out.println(cnt);
            }
        }
    }

    1243-Bob's Password

    题目描述

    Bob最新购入一款安卓手机,他发现安卓手机密码使用的是画线方式。
     一共有9个点,我们按行列顺序依次为1~9。密码要求在点和点之间连线不能有还未曾经过的点。
     比如说:从1出发,可以到2,4,5,6,7,8,但是不能到达3,7,9。
     但是如果从2出发,先到1,这时因为2已经经过了,所以此时可以到达3。
     现在给你一个密码,请问它是否符合密码的这个要求?
    输入
    第一行是一个整数T(1≤T≤10000),表示样例的个数。
     一个样例占一行,是一个最短为4位,最长9位,只含1-9的字符串,且1-9最多只有1个。
    输出
    每个样例输出一行,如果合法输出“Yes”,否则输出“No”。

     

    代码实现

    #include<bits/stdc++.h>
    using namespace std;
    
    string fb[] = {"13","31","17","71","19","91","28","82","39","93","37","73","46","64","79","97"};
    int main()
    {
        string s;
        int T;
        cin >> T;
        while(T--)
        {
            cin >> s;
            bool flag = true;
            int cnt=0;
            for(int i = 0; i < 16; i++)
            {
                int pos = s.find(fb[i]);//找到相应的下标
                if(pos != -1)//找到了在fb中存在的序列
                {
                    cout<<"存在!";
                    char t = (fb[i][0] + fb[i][1])/2;//找中间点
                    if(pos<s.find(t))//判断中间点是否在之前的序列中出现过
                        flag =false;
                }
            }
            if(flag)
            {
                printf("Yes
    ");
            }
            else
            {
                printf("No
    ");
            }
        }
        return 0;
    }

    说明:

    1. 提供的代码不一定是最优解。如有错误,欢迎指正。
    2. 仅供参考,请勿直接复制并提交。若执意如此,导致的后果本人概不负责。 

    最后!预祝大家程序设计实践全都过!过!过!!!

    【一文一图】

  • 相关阅读:
    四则运算题目生成器
    个人博客作业Week1
    M1/M2项目阶段总结
    个人博客作业week7
    个人博客作业—2
    第一周个人博客作业
    关于生成四则运算式
    个人博客作业week7
    第二次博客作业
    关于webservice大数据量传输时的压缩和解压缩
  • 原文地址:https://www.cnblogs.com/zhouie/p/10702604.html
Copyright © 2011-2022 走看看