————提高组————
第一题:deco的abs
题目链接:https://ac.nowcoder.com/acm/contest/934/A
因为每个数都可以加任意次 d ,所以可以推出 0 <= 相邻两个数的差值的绝对值 < d ,于是我们先让所有数对d取模
再枚举每个位置 ,用 last 记录上一个数的值 ,然后求 abs(a[now] - last) 、abs( a[now] + d - last)、abs( a[now] - d, last )即可
下面贴代码:
1 #include <bits/stdc++.h> 2 #define ll long long 3 const int N = 1e3+10; 4 using namespace std; 5 int n, d, now, last; 6 ll ans; 7 int main() 8 { 9 ios::sync_with_stdio(false); 10 while(cin>>n>>d>>last) 11 { 12 ans = 0; 13 for (int i = 2; i <= n; i++) 14 { 15 cin>>now; 16 int k = (now - last) % d; 17 ans += min(abs(k), min(abs(k - d), abs(k + d))); 18 last = now; 19 } 20 cout << ans << endl; 21 } 22 return 0; 23 }
第二题:
题目链接:https://ac.nowcoder.com/acm/contest/934/B
这道题的解法是莫比乌斯反演,因为这个算法我也才刚开始学,所以打的过程中出了很多问题