来源:互联网 发布:新手入门编程语言 编辑:程序博客网 时间:2024/06/07 07:08

今天我做了一个题大约是这样的:

 输入:(多组输入)

   首先输入一个值(d)表示接下来的输入中有几个数(1 < d < 2*10^5)

   接下来输入(d)个数(数只有0和1组成)当每个数与它后也个数不同时就会使就会使这个数与其后面的数一同消失;

 输出:

   一共会剩下几个数。

 样例:

  输入:

    4

    1010

  输出:

    0

 

 

 这个题一开始我的预想使用栈的思想,没想到还是用麻烦了啊!哎!

 用栈的思想:

#include
#include
#define MAX_N 200005
char ch[MAX_N];        //题目中所要求的(d)
char stack[MAX_N];     //按要求存入的栈
int top;               //栈的顶部(也就是栈内一共有几个数)
int main()
{
    int n,i;
    while(~scanf("%d",&n))        //多组输入
    {
        scanf("%s",ch);
        top = -1;                 //先使栈顶为-1也就是空栈
        for(i = 0; i < n; i++)
        {
            if(top >= 0 && stack[top] != ch[i])   //如果栈不为空栈并且栈顶元素与将要比较的元素不相同
            {
                top--;                            //栈顶出栈
            }
            else                                  //如果栈为空或栈顶与将要比较的元素相同
            {
                stack[++top] = ch[i];             //入栈
            }
        }
        printf("%d\n",top+1);                     //栈内有几个元素就是所求
    }
    return 0;
}
 

 

 简单的思想:

  我们思考一下整个题型就会发现(d)一共就会有两个数0、1,而如果存在0、1那么这个数列(我们先把d定义为数组)肯定有0、1的衔接点肯定会被去掉,慢慢的我们就会发现只要有不相同的数,这个数组就会进行“消去”,直到剩下的数字全部为相同的数........(发现了吗?)??说的再明白点就是数数有几个1几个0相减就OK了!!!!!!

#include
#include
#define MAX_N 200005
char ch[MAX_N];        //题目中所要求的(d)
int main()
{
    int n,i;
    int num1,num0;
    while(~scanf("%d",&n))
    {
        num1 = num0 = 0;            //num1为1的个数,num0为0的个数
        scanf("%s",ch);
        for(i = 0;i < n; i++)
        {
            if(ch[i] == '1')
                num1++;
            else
                num0++;
        }
        if(num1 > num0)
            printf("%d\n",num1-num0);
        else
            printf("%d\n",num0-num1);
    }
    return 0;
}

 

 

代码菜鸟,如有问题请多批评!!栈

0 0