Fork me on GitHub

程设刷题 | 程序设计实践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\n",d1,d2,d3);
        if(d1+d2==d3&&op=='+')
        {
            cnt++;
        }
        if(d1-d2==d3&&op=='-')
        {
            cnt++;
        }
    }
    printf("%d\n",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\n",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("\n");
        }
    }
    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\n", 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\n", 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\n",x,t,u);
        int tt=x<t?x:t;
        res=tt<u?tt:u;
        printf("%d\n",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\n",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\n",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\n",s);
        int digit = 0;
        while(ss){
            ss /= 10;
            digit++;
        }
        //printf("%d\n",digit);
        if(digit&1) digit++;
        if(digit<=4) printf("%I64d\n",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\n",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("\n");
    }
}

 

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\n",res[i].row, res[i].col, res[i].data);
        }
        printf("\n");
    }
    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("\n");
    }
}
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("\n");
        }
    }
    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\n", 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())!='\n')
        {
            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\n",i+1000);
        else
            printf("%d %s %s\n",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\n",cnt);
        sort(res,res+cnt);
        for(i=0; i<cnt; i++)
        {
            printf("%d",res[i]);
            if(i<cnt-1) printf(" ");
        }
        printf("\n");
    }
    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\n",likes[b]-likes[a]+1,dlikes[b]-dlikes[a]);
        }
        else if(x == 2)
        {
            printf("%d %d\n",likes[b]-likes[a], dlikes[b]-dlikes[a]+1);
        }
        else
        {
            printf("%d %d\n",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\n");
        else
        {
            //printf("%d\n",temp);
            for(temp=1; (b+a*temp!=c)&&(a+b*temp!=c); temp*=10)
            {
                cnt++;
            }
            //printf("%d\n",temp);
            if((b+a*temp)==c)
                printf("%d\n",cnt);
            else
                printf("-%d\n",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\n",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\n");
        }
        else
        {
            printf("No\n");
        }
    }
    return 0;
}

 

说明:

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

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

 

 

 

【一文一图】

posted @ 2017-08-29 23:45  zhouie  阅读(1353)  评论(0编辑  收藏  举报