程序设计实践练习题

阅读前请先了解此博客存在的不足与缺陷
博主开始写代码时对c++并未了解太多,头文件由于方便 都用的万能头
万能头优点就是简单,不用记太多头文件,缺点就是编译慢。
以及对变量的初始化,不应每次循环都重新定义,应使用循环重新赋值。
ps:存在很多问题,但是不想改了,但是阅读者应该了解。

1262 Fish

Description

钓鱼

题目描述

小明很喜欢钓鱼,现在有n 个池塘可以钓鱼,第i 个池塘首次内能钓到a i 条鱼。 第i 个池塘如果被钓过k 次,那么每次下一次能钓到的鱼的数目为max{0,a i −k×b i } 。 现在小明能钓m 次鱼,请问他最多能钓到多少条鱼?

输入

第一行是一个整数T(1≤T≤100) ,表示样例的个数。
每个样例的第一行是n(1≤n≤1000),m(1≤m≤100000) ;
以后的n行,每行是a i (1≤a i ≤10000),b i (0≤b i ≤10000) 。

输出

每行输出一个样例的结果。

样例输入

2
3 5
3 1
4 2
1 0
2 5
2 1
1 1

样例输出

12
4

样例解释

第一个样例,在第1个池塘钓3次,第2个池塘钓2次,3+2+1+4+2 = 12;
第二个样例,在第1个池塘钓2次,第2个池塘钓1次,2+1+1 = 4。

#include<bits/stdc++.h>
using namespace std;

struct pond
{
   
    int a;//参数ai
    int b;//参数bi
    int f;//某次钓鱼数量
    int k;//钓的次数
}ponds[1002];

bool cmp(const pond &pond1, const pond &pond2)
{
   
    return pond1.f>pond2.f;
}

int sorts(int n)
{
   
    for(int i = 1; i < n; i++)
    {
   
        if(ponds[i-1].f < ponds[i].f)
            swap(ponds[i-1],ponds[i]);
        else
            break;
    }
    return 0;
}

int main()
{
   
    int T,n,m;
    int fish;
    cin >> T;//T组样例
    while(T--)
    {
   
        fish = 0;
        cin >> n >> m;
        for(int i = 0; i < n; i++)
            cin >> ponds[i].a >> ponds[i].b;
        for(int j = 0; j < n ;j++)
        {
   
            ponds[j].f = ponds[j].a;
            ponds[j].k = 0;
        }
        sort(ponds,ponds+n,cmp);//排序
        /*每次都是ponds[0]被选择以及改变,所以被选择后只需要在排好序列中添加此更改的数据*/
        /*或者采用优先队列*/
        for(int i = 0; i < m; i++)
        {
   
            fish += ponds[0].f;
            ponds[0].k++;
            ponds[0].f = max(0,ponds[0].a - ponds[0].k * ponds[0].b);
            sorts(n);
            if(ponds[0].f == 0)
                break;
        }
        cout << fish <<endl;
    }
    return 0;
}

1271 Color

Description

染色

题目描述

Alice在玩一个游戏,她在一个m×n 的格子里,随机涂黑k 个格子。然后她每次可以把一行或者一列的格子染成红色,但是这一行中不能有黑色的格子。 请问她最多能把多少个格子涂成红色?

输入

第一行是一个整数T(T≤100) ,表示样例的个数。 每个样例的第一行是m(1≤m≤100),n(1≤n≤100),k(0≤k≤m×n) 。 以后的k 行,每行两个整数x(1≤x≤m),y(1≤y≤n) ,表示(x,y) 为黑色格子。

输出

每行输出一个样例的结果。

样例输入

1
3 4 2
1 1
3 3

样例输出

8

提示

样例如
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
int main()
{
   
    int T;
    int m,n,k;
    cin >> T;
    while(T--)
    {
   
        int c[102][102] = {
   0};//第0行第0列设置为额外空间
        cin >> m >> n >> k;
        int summ = 0,sumn = 0;
        for(int i = 0; i < k; i++)
        {
   
            int x,y;
            cin >> x >> y;
            c[x][0] = 1;//记录某行或某列被标记
            c[0][y] = 1;
        }
        for(int i = 1; i < m+1; i++)
        {
   
            if(c[i][0] == 0)
                summ++;
        }
        for(int i = 1; i < n+1; i++)
        {
   
            if(c[0][i] == 0)
                sumn++;
        }
        cout << m*sumn+n*summ-sumn*summ << endl;//公式计算
    }
    return 0;
}

1163 ASCII

Description

题目描述

给你一段ASCII编码的文字,输出其每个字符的ASCII码。

输入

一段文字,由ASCII码字符组成。

输出

先输出行号,行号为16进制,占5位,从0开始计数,行号前导为0,然后空一格。 每行最多输出32个字符的ASCII码,每个ASCII码为16进制,占2位,前导为0,中间用空格隔开。 所有16进制使用大写AF表示1015。最后一行行末无空格,无换行。

样例输入

ACM International Collegiate Programming Contest,
I LOVE YOU
Lotus is a mystic symbol. 

样例输出

00000 41 43 4D 20 49 6E 74 65 72 6E 61 74 69 6F 6E 61
00001 6C 20 43 6F 6C 6C 65 67 69 61 74 65 20 50 72 6F
00002 67 72 61 6D 6D 69 6E 67 20 43 6F 6E 74 65 73 74
00003 2C 0A 49 20 4C 4F 56 45 20 59 4F 55 0A 4C 6F 74
00004 75 73 20 69 73 20 61 20 6D 79 73 74 69 63 20 73
00005 79 6D 62 6F 6C 2E 20 0A
#include<bits/stdc++.h>
using namespace std;

int main()
{
   
    string str,str1;
    int m = 1;
    while(getline(cin,str1))//获取一行输入
    {
   
        str += str1;//连接字符串
        str +='\n';//加上换行符
    }
    printf("%05X ",m/16);//5位,大写前导0
    for(int i = 0; i < str.length()-1;i++)
    {
   
        printf("%02X",int(str[i]));
        if(m%16 == 0)
        {
   
            cout << endl;
            printf("%05X ",m/16);
        }
        else
            cout<<' ';
        m++;
    }
    printf("%02X",int(str[str.length()-1]));
    return 0;

}

1243 Bob’s Password

Description

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”。

样例输入

3
16852
213
132

样例输出

Yes
Yes
No
#include<bits/stdc++.h>
using namespace std;
int main()
{
   
    int T;
    cin >> T;
    int chose[10][10];
    chose[1][3]=1;
    chose[1][7]=1;
    chose[1][9]=1;
    chose[2][8]=1;
    chose[3][1]=1;
    chose[3][9]=1;
    chose[3][7]=1;
    chose[4][6]=1;
    chose[6][4]=1;
    chose[7][1]=1;
    chose[7][3]=1;
    chose[7][9]=1;
    chose[8][2]=1;
    chose[9][1]=1;
    chose[9][3]=1;
    chose[9][7]=1;

    while(T--)
    {
   
        string str;
        int num[10];
        bool chos[10];
        int t = 0;
        for(int i = 0; i < 10; i++)
            chos[i]= false;
        cin >> str;
        for(int i= 0; i < str.length(); i++)
        {
   
            num[i+1] = int(str[i])-48;
        }
        chos[num[1]] = true;
        for(t = 2; t <= str.length(); t++)
        {
   
            if(chose[num[t-1]][num[t]] == 1 && !chos[(num[t-1]+num[t])/2])
            {
   
                cout << "No" << endl;
                break;
            }
            chos[num[t]] = true;
        }
        if(t > str.length())
            cout << "Yes" <<endl;
    }
}

1246 Matrix Transposition

Description

Matrix Transposition

题目描述

矩阵转置就是把原矩阵A的所有元素a ij 转成矩阵B的b ji 。 现实中,大部分的矩阵都是稀疏的,所以,存储矩阵时,我们可以只存储存储每个非零元素的坐标和值,并且按行优先排序。 比如说3×3 矩阵

0 1 0
0 2 3
0 0 0

其转置矩阵为

0 0 0
1 2 0
0 3 0

上面矩阵使用稀疏矩阵的存储方法存(i,j,a ij ) 为

0 1 1
1 1 2
1 2 3

其转置矩阵

1 0 1
1 1 2
2 1 3

输入

第一行是一个整数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 XYV
{
   
    int x;
    int y;
    int v;
}XYVs[10001];
bool cmp(const XYV &xyv1,const XYV &xyv2)
{
   
    if(xyv1.y  == xyv2.y)
        return xyv1.x <xyv2.x;
    else
        return  xyv1.y < xyv2.y;
}
int main()
{
   
    int T;
    cin >> T;
    while(T--)
    {
   
        int N,M,K;//分别表示矩阵的行数,列数,非零元素个数
        cin >> N >> M >> K;
        for(int i = 0; i < K; i++)
        {
   
            cin >> XYVs[i].x >> XYVs[i].y >> XYVs[i].v;
        }
        sort(XYVs,XYVs+K,cmp);
        for(int i = 0; i < K; i++)
        {
   
            cout << XYVs[i].y << ' ' << XYVs[i].x << ' ' << XYVs[i].v<< endl;
        }
        cout << endl;
    }
    return 0;
}

1248 Alice and Bob

Description

Alice and Bob

题目描述

Alice和Bob在玩骰子游戏,他们用三颗六面的骰子,游戏规则如下:
1.点数的优先级是1点最大,其次是6,5,4,3,2。
2.三个骰子点数相同,称为"豹子",豹子之间按点数优先级比较大小。
3.如果只有两个骰子点数相同,称为"对子",对子之间按点数优先级比较大小。
4.其他情况称为"点子",点子按点数和比较大小。
5.豹子比对子、点子大,对子比点子大,如果对子的点数优先级相同,就看剩余那个骰子的点数优先级。

现在给你Alice和Bob投掷骰子的情况,判断一下胜负情况。

输入

第一行输入一个整数K,表示游戏的次数。 以后每两行表示一个样例,第一行是Alice骰子的点数。第二行是Bob骰子的点数。

输出

如果是Alice赢,输出"Alice",如果是Bob赢,输出"Bob",否则输出"Draw"。

样例输入

3
1 1 1
6 6 6
2 1 2
4 5 4
4 5 6
6 5 4

样例输出

Alice
Bob
Draw
#include<bits/stdc++.h>
using namespace std;
int Jud(int* A)//以数字大小比较优先级
{
   
    if(A[0] == A[1])
    {
   
        if(A[0] == A[2])
        {
   
            if(A[0] == 1)
                return 100*7;
            else
                return 100*A[0];
        }
        else
        {
   
            if(A[0] == 1)
                return 10*7+A[2];
            else if(A[2] == 1)
                return 10*A[0]+7;
            else
                return 10*A[0]+A[2];
        }
    }
    else if(A[0] == A[2])
    {
   
        if(A[0] == 1)
            return 10*7+A[1];
        else if(A[1] == 1)
            return 10*A[0]+7;
        else
            return 10*A[0]+A[1];
    }
    else if(A[1] == A[2])
    {
   
        if(A[1] == 1)
            return 10*7+A[0];
        else if(A[0] == 1)
            return 10*A[1]+7;
        else
            return 10*A[1]+A[0];
    }
    else
        return A[0]+A[1]+A[2];
}

int main()
{
   
    int T;
    cin >> T;
    while(T--)
    {
   
        int A[3];
        int B[3];
        scanf("%d %d %d",&A[0],&A[1],&A[2]);
        scanf("%d %d %d",&B[0],&B[1],&B[2]);
        int dian1 = Jud(A);
        int dian2 = Jud(B);
        if(dian1 > dian2)
            printf("Alice\n");
        else if(dian1 < dian2)
            printf("Bob\n");
        else
            printf("Draw\n");
    }
    return 0;
}

1251 Colombian Number

Description

Colombian Number

题目描述

对于正整数n ,不存在整数k ,使得n 等于k 加上k 的数码累加和,我们称这样的数是哥伦比亚数或者自我数。
比如 11就不是一个哥伦比亚数,因为10加上10的数码累加和1等于11;而20则是一个哥伦比亚数。

输入

第一行是一个整数K(K≤10,000) ,表示样例的个数。
以后每行一个正整数n(1≤n≤1,000,000,000)

输出

每行输出一个样例的结果,如果是哥伦比亚数输出"Yes",否则输出"No"。

样例输入

5
1
2
3
20
21

样例输出

Yes
No
Yes
Yes
No
#include<bits/stdc++.h>
using namespace std;

int Colnum(int i)
{
   
    int m = i;
    while(i != 0)
    {
   
        m += i%10;
        i /= 10;
    }
    return m;
}
int main()
{
   
    int T;
    cin >> T;
    while(T--)
    {
   
        int n,i;
        bool flag = true;
        cin >> n;
        for(i = n-1; i > 0 && i > n-81; i--)
        {
   
            if(Colnum(i) == n)
            {
   
                flag = false;
                break;
            }
        }
        if(flag)
            cout << "Yes" << endl;
        else
            cout << "No" << endl;
    }
    return 0;
}

1253 Robot

Description

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;
    while(cin >> n)
    {
   
        int sum = 0;
        int tran = 0;
        int m[1001] = {
   0};
        int fin[1001] = {
   0};
        for(int i = 0; i < n; i++)
        {
   
            scanf("%d",&m[i]);
        }
        while(true)
        {
   
            for(int i = 0; i < n; i++)
            {
   
                if(fin[i] == 0)
                {
   
                    if(sum >= m[i])
                    {
   
                        sum++;
                        fin[i] = 1;
                    }
                }
            }
            if(sum >= n)
                break;
            tran++;
            for(int i = n-1; i >= 0;  i--)
            {
   
                if(fin[i] == 0)
                {
   
                    if(sum >= m[i])
                    {
   
                        sum++;
                        fin[i] = 1;
                    }
                }
            }
            if(sum >= n)
                break;
            tran++;
        }
        cout << tran << endl;
    }
    return 0;
}

1252 Matrix Word

Description

Matrix Word

题目描述

一个n×m 的矩阵,矩阵每个元素是一个小写英文字母,如果某个字母所在行或者列不是唯一的,那么我们就删掉这个字符。最后,我们按矩阵的从上到下,从左到右,可以得到一个单词。比如,矩阵为

abb
bca
acb

我们可以发现只有第二行的b和a是所在行和列唯一的,所以最后的单词为ba。

输入

存在多个输入样例,每个样例的第一行是两个整数n 和m (1≤n,m≤100) 。
以后是一个n×m 的矩阵,矩阵每个元素一个小写英文字母。
输入数据保证结果不为空。

输出

每行输出一个样例的结果。

样例输入

3 3
aac
bca
abb
5 5
epero
gerea
emeee
meien
egeee

样例输出

cbca
programming
#include<bits/stdc++.h>
using namespace std;
int main()
{
   
    int n,m;
    while(cin >> n >> m)
    {
   
       char c[101][101];
       getchar();
       for(int i = 0; i < n; i++)
       {
   
           scanf("%s",c[i]);
       }
       for(int i = 0; i < n; i++)
       {
   
           for(int j = 0; j < m; j++)
           {
   
               int t,k;
               for(t = 0; t < n; t++)
               {
   
                   if(c[i][j] == c[t][j] && i != t)
                   {
   
                       break;
                   }
               }
               for(k = 0; k < m; k++)
               {
   
                   if(c[i][j] == c[i][k] && j != k)
                   {
   
                       break;
                   }
               }
               if(t >= n && k >= m)
               {
   
                   cout << c[i][j];
               }
           }
       }
       cout << endl;
    }
    return 0;
}

1261 Duplicate Elements

Description

Duplicate Elements

题目描述

给你n 个数,祛除其中的重复的数,并保持第一次出现的数原有的相对顺序。比如{3,2,2,3,1} ,那么祛除重复元素以后为{3,2,1} 。

输入

第一行是一个整数K ,K 表示样例的个数,不超过100。
每个样例的第一行是一个整数n(1≤n≤10000。) 表示数的个数;第二行是n 个正整数,其值不超过10 9 。

输出

每行输出一个样例的结果,每个整数之间用一个空格隔开。

样例输入

2
5
3 2 2 3 1
3
1 2 3

样例输出

3 2 1
1 2 3

提示

巨大的输入输出,请使用C风格的输入输出,避免超时。

#include<bits/stdc++.h>
using namespace std;
int main()
{
   
    int T;
    scanf("%d",&T);
    while(T--)
    {
   
        int m[10001] = {
   0};
        int num[10001][2] = {
   0};
        int n;
        scanf("%d",&n);
        for(int i = 0; i < n; i++)
            scanf("%d",&m[i]);
        int t = 0;//多少个不重复元素
        for(int i = 0; i < n; i++)//遍历m
        {
   
            int j;
            for(j = 0; j <= t; j++)//遍历不重复元素数组,寻找是否有与m[i]相同的数
            {
   
                if(m[i] == num[j][0
  • 15
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值