2017-6-1
题目大意
农夫约翰的奶牛不停地从他的农场中逃出来,导致了很多损害。为了防止它们再逃出来,他买了一只很大的号码锁以防止奶牛们打开牧场的门。
农夫约翰知道他的奶牛很聪明,所以他希望确保它们不会在简单地试了很多不同的号码组合之后就能轻易开锁。锁上有三个转盘,每个上面有数字1..N (1 <= N <= 100),因为转盘是圆的,所以1和N是相邻的。有两种能开锁的号码组合,一种是农夫约翰设定的,还有一种“预设”号码组合是锁匠设定的。但是,锁有一定的容错性,所以,在每个转盘上的数字都与一个合法的号码组合中相应的数字相距两个位置以内时,锁也会打开。
比如说,如果农夫约翰的号码组合是(1,2,3),预设号码组合是(4,5,6),在转盘被设定为(1,4,5)(因为这和农夫约翰的号码组合足够接近)或(2,4,8)(因为这和预设号码组合足够接近)。注意,(1,5,6)并不会打开锁,因为它与任一号码组合都不够接近。
给出农夫约翰的号码组合和预设号码组合,请计算能够开锁的不同的号码组合的数目。号码是有序的,所以(1,2,3)与(3,2,1)不同。
(copy from nocow)
题解
N大于5时, 对于农夫约翰的密码,有5×5×5 = 125种不同的密码可以开锁。同样的,对于预设密码,也有125种不同的密码可以开锁。250 减去通过这约翰的密码和预设密码生成的密码中重复密码的个数,就是答案。对于N小于5,密码个数就是N×N×N。
代码
/*
ID: zachery1
PROG: combo
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <algorithm>
#define cin fin
#define cout fout
using namespace std;
ifstream fin("combo.in");
ofstream fout("combo.out");
int main() {
int n, total, ans;
int a1, b1, c1;
int a2, b2, c2;
cin >> n;
cin >> a1 >> b1 >> c1 >> a2 >> b2 >> c2;
if (n < 5) ans = n*n*n;
else {
total = 5*5*5*2;
int abs1 = abs(a1-a2), abs2 = abs(b1-b2), abs3 = abs(c1-c2);
int t1 = min(abs1, n-abs1), t2 = min(abs2, n-abs2), t3 = min(abs3, n-abs3);
t1 = max(0, 5-t1); t2 = max(0, 5-t2); t3 = max(0, 5-t3);
ans = max(0, total - t1*t2*t3);
}
cout << ans << endl;
return 0;
}