2020-5-21

问题 E: 流星

时间限制: 1 Sec  内存限制: 128 MB
[提交] [状态]

题目描述

我带着深藏骨血的仇恨与酝酿多年的阴谋
把自己变成一个死而复生的幽灵沉入沼泽,沉入深渊
我想埋下腐烂的根系长出见血封喉的荆棘刺穿这个虚伪的文明
我到了淤泥深处……捡到了一颗星星。
晨光起于白塔尖顶,终将铺满阴霾之地。
Marser正在和副词看星星。这时,他们发现了一颗流星划过天际。Marser出于习惯,记录下了这颗流星出现和消失的位置。Marser两组坐标来描述这两个位置。你可以认为它们被Marser放在了一个原点由Marser指定的笛卡尔坐标系中。

现在,副词为了考验Marser的智商,想问他一个问题:按照Marser的坐标系定义,这颗流星一共经过了多少个格点?这里,格点被定义为坐标均为整数的点。

Marser用了1ms就完成了这个问题,于是他想用这个问题来测试您的智力。当然,为了简化您的操作,您可以把流星的运动轨迹看成一条直线。这样,您可以把这个问题转化为求一条线段除了端点外经过了多少个格点。

输入

读入两行,每行两个整数 x,y,表示线段的两个端点的坐标。

输出

输出一行一个整数,表示除了两个端点外,线段经过的格点数量。

样例输入 Copy

1 11
5 3

样例输出 Copy

3

提示

对于30%的数据,保证max(∣x∣,∣y∣)≤103;
对于60%的数据,保证max(∣x∣,∣y∣)≤106;
对于全部数据,保证max(∣x∣,∣y∣)≤1012。

[提交][状态]

GPLv

 

#include 
using namespace std;
typedef long long ll;
ll gcd(ll x,ll y)
{
    if(y==0) return x;
    else return gcd(y,x%y);
}
int main()
{
    ll  a,b,c,d;
    cin>>a>>b>>c>>d;
    if(a==c&&b==d) {printf("0");return 0;}
    c=fabs(c-a);d=fabs(d-b);
    if(d==0) printf("%lld",c-1);
    else if(c==0) printf("%lld",d-1);
    else
    {
        printf("%lld",gcd(c,d)-1);
    }
    return 0;
}

问题 G: 麦田

时间限制: 1 Sec  内存限制: 128 MB
[提交] [状态]

题目描述

我心里有一簇迎着烈日而生的花,
比一切美酒都要芬芳,
滚烫的馨香淹没过稻草人的胸膛,
草扎的精神,从此万寿无疆。
凝视深渊的人,深渊也在凝视你。
我不是凝视深渊的人,我就是深渊。
Marser 来到了一片麦田。他想穿过这片麦田,去找副词一起学习。

但是,他发现这片麦田有一些特殊的性质。我们可以把麦田抽象成一片 n×mn \times mn×m 的网格,每个格子上都有一个数字。同时,Marser 按如下的方式表示前进的方向:

如果往与所在格子上数字相同的方向前进,Marser 不需要花费体力;而往其他方向前进时,Marser 就需要额外花费 1单位的体力。

现在,Marser 想知道,从给定的起点前进到给定的终点,最少

输入

第一行两个整数 n,m(n,m≤1000),表示麦田的大小。
接下来 n 行,每行一个长度为 m 的字符串,表示每个格子上的数字。
接下来一行,四个整数 xs,ys,xt,yt,表示起点和终点的位置。

输出

输出一行一个整数,表示最少需要消耗的体力。

样例输入 Copy

5 5
04125
03355
64734
72377
02062
4 2 4 2

样例输出 Copy

0

 

http://icpc.upc.edu.cn/problem.php?cid=2431&pid=6 有一个路线图

 

这道题得做法很多,但是我还是借鉴了这种做法,比dfs或者bfs速度快。

 

#include 
using namespace std;
typedef long long ll;
int n,m,sx,sy,tx,ty;
int a[1005][1005];
int dx[10]= {-1,-1,0,1,1,1,0,-1};
int dy[10]= {0,1,1,1,0,-1,-1,-1};
int dis[1005][1005];
int que[1000000][2];
int main()
{
    scanf("%d %d",&n,&m);
    for(int i=1; i<=n; i++)
    {
        char str[m+5];
        scanf("%s",str);
        for(int j=1; j<=m; j++)
            a[i][j]=str[j-1]-'0';
    }
    cin>>sx>>sy>>tx>>ty;
    memset(dis,0x3f3f3f,sizeof(dis));
    dis[sx][sy]=0;
    int head=0,tail=1;
    que[head][0]=sx;que[head][1]=sy;
    while(head!=tail)
    {
        int x=que[head][0],y=que[head][1];
        head++;
        if(x==tx&&y==ty)
            break;
        for(int i=0; i<8; i++)
        {
            int xx=x+dx[i],yy=y+dy[i];
            if(!xx||!yy||xx>n||yy>m)
                continue;
            if(dis[xx][yy]>dis[x][y]+(a[x][y]!=i))
            {
                dis[xx][yy]=dis[x][y]+(a[x][y]!=i);
                if(a[x][y]!=i)
                {
                    que[tail][0]=xx;
                    que[tail][1]=yy;
                    tail++;
                }
                else
                {
                    head--;
                    que[head][0]=xx;
                    que[head][1]=yy;
                }
            }

        }
    }
    printf("%d",dis[tx][ty]);
}

问题 D: 坏掉的手表

时间限制: 1 Sec  内存限制: 128 MB
[提交] [状态]

题目描述

有个手表坏了,时间为HH:MM,你要把这个不合法的时间变为合法,请求出最少要动几位

输入

第一行表示手表时间是什么制式
第二行HH:MM表示手表当前时间

输出

一个整数表示答案

样例输入 Copy

12
17:30

样例输出 Copy

1

 

对于12小时时制,没有00:00 它是12:00-12:01-----12:59--01:00--01:01

对于24小时时制,没有24:00,它是00:00-00:01--00:02---23:58--23:59--00:00

#include 
using namespace std;
typedef long long ll;
 
int main()
{
    int type,hh,mm,sum=100;
    scanf("%d",&type);
    scanf("%d:%d",&hh,&mm);
    for(int i=0; i<=9; i++)
    {
        for(int j=0; j<=9; j++)
        {
            for(int k=0; k<=9; k++)
            {
                for(int l=0; l<=9; l++)
                {
                    int ans=0,f=0;
                    if(type==12)
                    {
                        if(i==0&&j==0&&k==0&&l==0)
                            continue;
                            if(i*10+j==0) continue;
                        if(((i*10+j

 

你可能感兴趣的:(题解)