洛谷日志(1)

前言

#include 

好吧,我们来看看头文件里有啥:

typedef struct
{
    grade = "大一";
    learn_lang = c;
    level = "greenhorn";
    words_1 = "由于大一自由时间较多,所以写日志记录一下洛谷的刷题日常~"
    words_2 = "新手太菜,如果有人看到(应该没人看)帖子可以指出问题或者提供思路,\
               不要喷。谢谢";
}me;

原题

摘自洛谷题库P1428

题目描述

人比人,气死人;鱼比鱼,难死鱼。小鱼最近参加了一个“比可爱”比赛,比的是每只鱼的可爱程度。参赛的鱼被从左到右排成一排,头都朝向左边,然后每只鱼会得到一个整数数值,表示这只鱼的可爱程度,很显然整数越大,表示这只鱼越可爱,而且任意两只鱼的可爱程度可能一样。由于所有的鱼头都朝向左边,所以每只鱼只能看见在它左边的鱼的可爱程度,它们心里都在计算,在自己的眼力范围内有多少只鱼不如自己可爱呢。请你帮这些可爱但是鱼脑不够用的小鱼们计算一下。

输入格式

第一行输入一个正整数n,表示鱼的数目。

第二行内输入n个正整数,用空格间隔,依次表示从左到右每只小鱼的可爱程度。

输出格式

一行,输出n个整数,用空格间隔,依次表示每只小鱼眼中有多少只鱼不如自己可爱。

题解

首先分析一下,这道题就是给一行整数,然后计算每个整数左边有多少个数比自己小,然后将个数放在自己的位置上。

#include 

int main(void){
    //获取n的值并创建数组
    int n;
    scanf("%d",&n);
    int list[n];
    //申请指针指向数组
    int *p = list;
    //获取数组内容
    for (int i = 0;i < n;i++){
        scanf("%d",p + i);
    }

上面比较基础没啥好说的,不过这道题不一定要用指针,这里使用是为了练习(小孩子比较喜欢炫耀新学的东西,嘻嘻嘻。)

//创建从后往前的循环
for (int i = n - 1;i > 0;i--){
        int temp = *(p + i);//将最后一个数存入temp
        for (int j = 0;j < i;j++){
            if (*(p + j) < *(p + i) ){
                temp += 1;//从第一个一直判断到该位数,只要有小的就使temp加一
            } 
        }
        *(p + i) = temp - *(p + i);//temp其实就是原数值加上要求的结果,这里减掉
    }

这个思路应该算比较奇葩了,初代版本有点问题,发求助帖把洛谷老哥绕晕了,不过人家多看了几遍还是为我解答了。

总体上来说,从后往前处理,因为某一位的结果只有它左边的所有数字决定和右侧无关,所以从右往左处理不会互相干扰。

对于某个数,需要找出左边所有比他小的数的个数,并将这个个数存在该位。首先,创建一个temp的变量,先将数的大小存在temp中,然后利用for循环得出左边比他小的数的个数,在循环中逐个加到temp上,此时temp的值就是原数值和要求结果的和,所以这里让指针指向的数组的那个数等于temp剪掉它原本的值,就是要求的结果,即左侧更小的数的个数。

可能这个方法有点绕,但是我想做的是尽量不借助其他数组或者更多的变量,就使用一个指针来完成计数和数组元素的替换,

    for (int i = 0;i < n;i++){
        printf("%d ",*(p + i));
    }
}

遍历数组。

你可能感兴趣的:(洛谷日志,算法,c语言)