华农Acm:scau 9521 射了多少2

7 篇文章 0 订阅
3 篇文章 0 订阅

华农Acm Scau 9521

题目


#9521 射了多少 II
该题有题解
时间限制:1000MS  内存限制:65535K
提交次数:81 通过次数:25

题型: 编程题   语言: G++;GCC
Description
    大家都知道CS中的AWP可以一枪KO人家,最爽的就是没看到别人,但知道人家在墙后而一枪穿墙爆头击毙.
    现在把CS地图定义为一个三维空间,你的位置在(x0,y0,z0),你不知道敌人的位置(除非有间谍),因此你想尽可能多的穿过地图上的格子.
    但你不知道如何计算当他射向点(x1,y1,z1)(到x1,y1,z1停下来)的时候穿过了多少个格子,因此希望你这个强大的programmer帮忙



输入格式
    输入中一共有两行
    第一行是3个整数表示你的位置x0,y0,z0(1000>=x0,y0,z0>=0)
    第二行是3个整数表示子弹停下的位置x1,y1,z1(1000>=x1,y1,z1>=0)


输出格式
    输出只有一行
    穿过的格子数(碰到不算穿过任何格子,要严格穿过)


输入样例
0 0 0
2 2 2


输出样例
2


来源 ick2 

作者 a470086609

题解

寻找规律,利用上一题目的规律会发现其实是稍微容斥一下下就好了


Code

    #ifdef local
#include    <ctime>
#endif
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <map>
#define rep(i,e) for(int i=0;i<e;i++)
#define rep1(i,e) for(int i=1;i<=e;i++)
#define repx(i,x,e) for(int i=x;i<=e;i++)
#define ll long long
#define pii pair<int,int>
#define F first
#define S second
#define pb push_back
#define mp make_pair
#define mset(var,val) memset(var,val,sizeof(var))
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#define scd(a) scanf("%d",&a)
#define scdd(a,b) scanf("%d%d",&a,&b)
#define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define test(a) cout<<a<<endl
#define test2(a,b) cout<<a<<" "<<b<<endl
#define test3(a,b,c) cout<<a<<" "<<b<<" "<<c<<endl
typedef unsigned long long ull;
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 1e6 + 10;
int x0;
int x1;
int y1;
int y0;
int z0;
int z1;
int gcd(int a, int b) {
    if(a == 0 || b ==0)return 0;
    if (a < b) { //保证a大于等于b,便于a%b的运算
        int temp;
        temp = a;
        a = b;
        b = temp;
    }
    while (a % b) { //如果余数不为0,就一直进行辗转相除
        int r = a % b; //r为a和b的余数,即r = a mod(b);
        a = b;
        b = r;
        r = a % b;
    }
    return b;
}

void work() {
    cin >> x0 >> y0 >> z0 >> x1 >> y1 >> z1;
    int dx = abs(x0 - x1);
    int dy = abs(y0 - y1);
    int dz = abs(z0 - z1);
    int ans= dx+dy+dz-(gcd(dx,dy)+gcd(dx,dz)+gcd(dy,dz))+(gcd(gcd(dx,dy),dz));
    cout<<ans<<endl;    
}
int main() {
    int debug = 0;
#ifdef local
    debug = 1;
#endif
    if (debug) {
        freopen("in.txt", "r", stdin);
        freopen("out", "w", stdout);
        printf("debuging output:\n");
    }
    work();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值