P8547 小挖的时间
Aya_tt
·
·
题解
这题我觉得是考验一些小技巧。
如果一个一个枚举过去的时间,只能获得 60 分。
时限是 1 秒,所以我们就必须想着优化。那我们就是分模块讨论一下这道题目。
我们可以开个数组 $a$ 维护时间一位加一,如果等于十了,就进位,注意,第二位就是等于六的时候进位了。改进位的时候进位,值得注意的是十二点五九分后面是一点,需要特判。
$2$,优化
正如我们前面所说,直接一个个枚举时间,是不足已通过此题的,于是我们就想到了时间是循环的,一个循环是 $720$ 分钟,我们可以用我们暴力的程序,跑出发现一天是有 $31$ 个等差数列,所以在我们程序在跑之前,可以先看看过去了几天,然后就加上几天个 $31$,之后再取余,跑一遍我们的暴力程序,此时,我们最坏查询的时间复杂度也接近线性,足以通过此题。
$3$,代码实现
```c
#include<bits/stdc++.h>
using namespace std;
int a[5] = {0,1,2,0,0},Q;
long long ans;
int main(){
cin >> Q;
while(Q--){
int n;
cin >> n;
int l = n / 720;
ans += l * 31;
n %= 720;
for(register int i = 1;i <= n;i++){
a[4]++;
if(a[4] == 10){
a[4] = 0;
a[3]++;
if(a[3] == 6){
a[3] = 0;
a[2]++;
if(a[2] == 3 && a[1] == 1){
a[1] = 0;
a[2] = 1;
}
if(a[2] == 10){
a[1]++;
a[2] = 0;
}
}
}
if(a[1] == 0){
if(a[4] - a[3] == a[3] - a[2]){
//cout<<a[1]<<" "<<a[2]<<" "<<a[3]<<" "<<a[4]<<endl;
ans++;
}
}
else if(a[4] - a[3] == a[3] - a[2] && a[2] - a[1] == a[3] - a[2]){
//cout<<a[1]<<" "<<a[2]<<" "<<a[3]<<" "<<a[4]<<endl;
ans++;
}
}
cout<<ans<<endl;
ans = 0;
a[1] = 1,a[2] = 2,a[3] = 0,a[4] = 0;//一定要清零!!
}
}
```