12.27总结

目录

1.聪明的LJY

题目描述

2. 验证栈序列

题目描述

 

聪明的LJY

题目描述

在我还是一个小小小的程序猿时(虽然现在还是小小的程序猿的。。。),LJY他就很聪明了,可是他怎么教我都有不会做的题。。。
有一天,我被学校指派了任务,要去zjj的m个地方买东西,惨了我这老胳膊老腿。这是LJY看到我愁眉苦脸,走了过来,拿出zjj的地图把它神奇的分为100*100的网格,使每个我要去的目的地都落在网格之中(假设每个地方都不重叠),然后他说只要你在这些网格中任意选一个,你到各个目的地的总距离就会最小,我就百思不得其解了。
同样聪明的你们,能帮我解决问题吗?求出最短总距离。(注意:因为地形复杂,只能向横纵方向行走)

输入

第一行一个整数n<20,表示有n组测试数据,下面是n组数据;
每组第一行一个整数m<20,表示本组有m个目的地,下面的m行每行有两个整数0<=x,y<=100,表示某个目的地的坐标。
m行后是新一组的数据;

输出

每组数据输出到最小的距离和,回车结束;

样例输入

2
3
1 1
2 1
1 2
5
2 9 
5 20
11 9
1 1
1 20

样例输出 

2
44

提示

设a(x1,y1),b(x2,y2),d|ab|=|x1-x2|+|y1-y2|.

#include<stdio.h>
#include<math.h>
long long sqr(int x1,int y1,int x2,int y2)
{
    long long k;
    k=abs(x1-x2)+abs(y1-y2);      
    return k;
}
void main()
{
  long long min=100000,s;
    int n,m;

    int x[20],y[20];
    while(scanf("%d",&n)!=EOF)
    {
        while(n--)
       {
           scanf("%d",&m);
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&x[i],&y[i]);
        }
        s=0;
        min=100000;
        for(int a=0;a<=100;a++)       
            for(int b=0;b<=100;b++)   
        {
           for(int i=0;i<m;i++)
                s+=sqr(a,b,x[i],y[i]);
           if(min>s)
           {
               min=s;
           }
           s=0;
        }
  
        printf("%lld\n",min);
       }
    }
}

 

 验证栈序列

题目描述

给出两个序列 pushed 和 poped 两个序列,其取值从 1 到 n(n\le100000)n(n≤100000)。已知入栈序列是 pushed,如果出栈序列有可能是 poped,则输出 Yes,否则输出 No。为了防止骗分,每个测试点有多组数据。

输入格式

第一行一个整数 qq,询问次数。

接下来 qq 个询问,对于每个询问:

第一行一个整数 nn 表示序列长度;

第二行 nn 个整数表示入栈序列;

第三行 nn 个整数表示出栈序列;

输出格式

对于每个询问输出答案。

输入输出样例

输入 #1复制

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

输出 #1复制

Yes
No

当时写这个题目的时候我以为思路很简单,就是将序列a的数先入栈,然后再一个个出栈去和输入的出栈序列比较,不相等就直接跳出,但是这个思路是错误的,我没有了解出栈序列的合法性 

对于一个进栈序列其出栈序列存在多种合法的可能情况。

例如:入栈序列为1,2,3,4,5时,而对于出栈序列5,4,3,2,1 、1,3,2,5,4、3,5,4,2,1等都是一个合法的出栈序列,但是对于 3,5,2,4,1、5,3,4,2,1 等这种出栈序列则是非法的序列,因为其违背了栈的特性(先进后出或者后进先出)。

#include<stdio.h>
int n;
int top=0;
int a[100000],b[100000],c[100000];
void pushed(long num)
{
    c[++top]=num;
}
void poped()
{
     c[top--];
}
int main()
{
   int q,num,k,i;

    scanf("%d",&q);
        while(q--)
        {
            scanf("%d",&n);
            for(i=1; i<=n; i++)
            {
                scanf("%d",a+i);

            }
            for(i=1; i<=n; i++)
                scanf("%d",b+i);
            k=1;
            for(i=1;i<=n;i++)
            {
                pushed(a[i]);
                while(c[top]==b[k])
                {
                    poped();
                    k++;
                    if(top==0) break;
                }
            }
            if(top==0) printf("Yes\n");
            else
            {
                printf("No\n");
            }
            while(top!=0) poped();
            top=0;
        }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值