时间限制: 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;
}
时间限制: 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]);
}
时间限制: 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