2021.12.17 学习总结

AC了新星杯找鞍点和红绿灯的题,找鞍点开始用的二维数组来找,改到错误7%整的我还挺高兴,结果是只对了7%,蚌埠住了啊,太难过了呀。但我学到了暴力枚举,用枚举解决这题,比我吭哧吭哧用二维数组好想多了啊。

6649: 套马的汉子

题目描述

一天ysj写出来了一个题目,在实验室里欢呼,wtj看到他这么高兴,就过去看了看他写了个什么题目。

题目如下:

如果矩阵A中存在这样的一个元素A [ i , j ]满足条件:A [ i , j ]是第i行中值最小的元素,且又是第 j 列中值最小的元素,则称之为该矩阵的一个马鞍点。请编程计算出m*n的矩阵A的所有马鞍点。

如果某一行的最小值为2,而这一行有3个2,我们认为这三个2都是最小的元素。

wtj觉得这个题目太简单了,于是给这个题目加了一个难度。

即现在给你n个相同大小的矩阵,每个矩阵的大小是x*y。如果某个位置,在每个矩阵都是马鞍点,我们称为套马点。

请你找出套马点的个数

输入格式

第一行输入一个数n,表示有n个矩阵 1<n<10
第二行输入两个数x,y 表示矩阵有x行,每行y个数。 (1<x,y<10)
然后输入 n*x行,每行y个数。 表示n个矩阵。
每个数的大小为  [0,100] 

输出格式

输出套马点的个数

样例输入

3 2 4
1 2 3 4
5 6 7 8
1 2 3 4
5 1 7 8
1 3 2 4 
4 6 7 3

样例输出

1
#include<stdio.h>
int a[100][100][100];
int main()
{
    int n,x,y,sum=0,flag;
    int i,j,l,k;
    scanf("%d%d%d",&n,&x,&y);
    for(i=0; i<n; i++)
    {
        for(j=0; j<x; j++)
        {
            for(k=0; k<y; k++)
            {
                scanf("%d",&a[i][j][k]);
            }
        }
    }
    for(i=0; i<x; i++)
    {
        for(j=0; j<y; j++)
        {
            flag = 0;
            for(k=0; k<x; k++)
            {
                for(l=0; l<n; l++)
                {
                    if(a[l][k][j]<a[l][i][j])
                    {
                       flag=1;
                       break;
                    }
                }
            }
            for(k=0; k<y; k++)
            {
                for(l=0; l<n; l++)
                {
                    if(a[l][i][k]<a[l][i][j])
                    {
                        flag=1;
                        break;
                    }
                }
            }
            if(flag==0)
            {
                sum++;
            }
        }
    }
    printf("%d",sum);
    return 0;
}

 写了2个洛谷上的暴力枚举的题,还学了点儿c++

P2241 统计方形(数据加强版)

题目背景

1997年普及组第一题

题目描述

有一个 n \times mn×m 方格的棋盘,求其方格包含多少正方形、长方形(不包含正方形)。

输入格式

一行,两个正整数 n,mn,m(n \leq 5000,m \leq 5000n≤5000,m≤5000)。

输出格式

一行,两个正整数,分别表示方格包含多少正方形、长方形(不包含正方形)。

输入输出样例

输入

2 3

输出

8 10
//通过暴力枚举学习一下c++蛤
#include<iostream>
using namespace std;
const int N = 5010;
int main()
{
    int n,m,i,j;
    long long a=0, b=0;
    cin >> n >> m;
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=m; j++)
        {
            if(i==j)
                a += (n-i+1)*(m-j+1);
            else
                b += (n-i+1)*(m-j+1);
        }
    }
    cout << a << ' ' << b << endl;
    return 0;
}

 下面这个烧鸡我开始用dfs写的通过60%,怎么改也该不对了,明天dfs再改一改。暴力枚举整这题就很简单。

P2089 烤鸡

题目背景

猪猪 Hanke 得到了一只鸡。

题目描述

猪猪 Hanke 特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke 吃鸡很特别,为什么特别呢?因为他有 1010 种配料(芥末、孜然等),每种配料可以放 11 到 33 克,任意烤鸡的美味程度为所有配料质量之和。

现在, Hanke 想要知道,如果给你一个美味程度 nn ,请输出这 1010 种配料的所有搭配方案。

输入格式

一个正整数 nn,表示美味程度。

输出格式

第一行,方案总数。

第二行至结束,1010 个数,表示每种配料所放的质量,按字典序排列。

如果没有符合要求的方法,就只要在第一行输出一个 00。

输入输出样例

输入

11

输出

10
1 1 1 1 1 1 1 1 1 2 
1 1 1 1 1 1 1 1 2 1 
1 1 1 1 1 1 1 2 1 1 
1 1 1 1 1 1 2 1 1 1 
1 1 1 1 1 2 1 1 1 1 
1 1 1 1 2 1 1 1 1 1 
1 1 1 2 1 1 1 1 1 1 
1 1 2 1 1 1 1 1 1 1 
1 2 1 1 1 1 1 1 1 1 
2 1 1 1 1 1 1 1 1 1 

说明/提示

对于 100\%100% 的数据,n \leq 5000n≤5000。

#include<stdio.h>
int main()
{
    int n,count=0;
    scanf("%d",&n);
    for(int a=1; a<4; a++)
    {
        for(int b=1; b<4; b++)
        {
            for(int c=1; c<4; c++)
            {
                for(int d=1; d<4; d++)
                {
                    for(int e=1; e<4; e++)
                    {
                        for(int f=1; f<4; f++)
                        {
                            for(int g=1; g<4; g++)
                            {
                                for(int h=1; h<4; h++)
                                {
                                    for(int i=1; i<4; i++)
                                    {
                                        for(int j=1; j<4; j++)
                                        {
                                            if(a+b+c+d+e+f+g+h+i+j==n)
                                            {
                                                count++;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    printf("%d\n",count);
    for(int a=1; a<4; a++)
    {
        for(int b=1; b<4; b++)
        {
            for(int c=1; c<4; c++)
            {
                for(int d=1; d<4; d++)
                {
                    for(int e=1; e<4; e++)
                    {
                        for(int f=1; f<4; f++)
                        {
                            for(int g=1; g<4; g++)
                            {
                                for(int h=1; h<4; h++)
                                {
                                    for(int i=1; i<4; i++)
                                    {
                                        for(int j=1; j<4; j++)
                                        {
                                            if(a+b+c+d+e+f+g+h+i+j==n)
                                            {
                                                printf("%d ",a);
                                                printf("%d ",b);
                                                printf("%d ",c);
                                                printf("%d ",d);
                                                printf("%d ",e);
                                                printf("%d ",f);
                                                printf("%d ",g);
                                                printf("%d ",h);
                                                printf("%d ",i);
                                                printf("%d ",j);
                                                printf("\n");
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    return 0;
}

 那个红绿灯的题好屎,左转的同时右边直行,直行的同时左边左转。

6614: 繁忙的路口

题目描述

无聊的会长今天出去打狂犬疫苗,因为被来福咬了。路上会长路过了一个十字路口,在等红绿灯,发现时间居然是99秒,会长觉得这很不合理,于是想要自己设计一套红绿灯算法,但是由于会长刚刚被喵咬了还没打狂犬疫苗,出现了短暂的神志不清,就连基本的红绿灯合理性都判断不出来了,你能帮帮会长吗?

如图,一个十字路口(双向车道),有四个信号灯(图中用数字标示),有两种信号左转和直行(右转可以直接走),只考虑红灯(停止信号)和绿灯(放行信号),没有黄灯。用“R”代表红灯,用“G”代表绿灯,从一号信号灯开始依次给出四个信号灯的信号(对于每个信号灯先输出左转信号再输出直行信号),请告诉会长该情况下是否合理,合理指没有两辆或以上的车辆通过路口的行车轨迹会相交或重合。


 

输入格式

一行八个字符代表四个信号灯的信号值

输出格式

如果合理,请输出"perfect",否则输出"terrible"(不带引号)。

样例输入

RGRRRGRR

样例输出

perfect
#include<stdio.h>
char a[10];
int main()
{
    int i,k=0;
    gets(a);
    for(i=0; i<8; i++)
    {
        if(a[i] == 'G')
            k++;
    }
    if(k<2 || k>2)
    {
        printf("terrible");
    }
    else if(k==2)
    {
        if(a[0]=='G' && a[3]=='G') //左转 右边直行
            printf("perfect");
        else if(a[1]=='G' && a[6]=='G') //直行 左边左转
            printf("perfect");
        else if(a[2]=='G' && a[5]=='G')
            printf("perfect");
        else if(a[4]=='G' && a[7]=='G')
            printf("perfect");
        else if(a[1]==a[5] && a[1]=='G')
            printf("perfect");
        else if(a[2]==a[6] && a[2]=='G')
            printf("perfect");
        else if(a[3]==a[7] && a[3]=='G')
            printf("perfect");
        else if(a[4]==a[0] && a[4]=='G')
            printf("perfect");
        else
            printf("terrible");

    }
    return 0;
}

昨天跟彭老师学习了链表,彭老师讲的明白哇。

链表是一条有很多节点的链,每个结节点就是一个结构体,里面用指针存下一个节点的地址。

简单链表就是这个节点的值以及这个节点指向下一个节点的指针。

#include<stdio.h>
#include<stdlib.h>
struct node
{
    char date;
    struct node *next;
};

双向链表就是在此基础上加上一个指向上一个节点的指针。

每用一个节点就要申请一次空间,但是c语言不能new出空间,所以要用申请空间的函数malloc,这里p是个指针。

p = (struct node *)malloc(sizeof(struct node));

链表的连接方法有两种:a.头插法  b.尾接法

尾接法就是把新来的链表节点接在原来链表的尾部,如果链表是空的,那么就放在头节点的后面。通常我们让链表的头节点的值为空比较方便。头节点只需要存指向下一个节点的指针。

//尾接法:
struct node *head1, *head2, *p, *q;
int n,i;
char a;
scanf("%d",&n);
head1 = NULL;
head2 = NULL;
getchar();
for(i=0; i<n; i++)
{
    scanf("%c",&a);
    p = (struct node *)malloc(sizeof(struct node));
    p -> date = a;
    p -> next = NULL;
    if(head1 == NULL)
        head1 == p;
    else
        q -> next = p;
    q = p;
}

链表的遍历需要把循环写成这样(p是个指针):

for(p=head1->next; p!= NULL; p=p->next)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值