CodeForce刷题表
Day6
题意:
给定一个数组,每次选择最小的数删除,其他的所有数减去这个数。
问删除的数最大值是多少。
思路:
只需要排好序,默认最大值是a[1] 然后遍历一遍a[i]-a[i-1]的求最大值即可。
因为同时减去一个数等于都没减……因为: (a[3] - a[1]) - (a[2] - a[1]) = a[3] - a[2]
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e6+5; const ll mod = 1e9+7; int a[N]; int main(){ int _;cin>>_; while(_--) { int n; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+1+n); int res = a[1]; for(int i=2;i<=n;i++) res = max(res,a[i]-a[i-1]); cout<<res<<endl; } return 0; }
|
总结:
同时减去(加上)一个数可以某种意义上认为都没有减(加)。
题意:
找到一个数k,使数组内的数减去任意次k可以使整个数组相等。
思路:
求所有s[i] - s[i-1]的gcd,最后的gcd大于等于1就输出,否则输出-1。
列个式子表示一下:
a - k x = b - k y =》假设 a减去x个k 等于 b减去y个k
a - b = k (x - y)
(a - b) / k = x - y =》 从这个式子就可以看出很多东西。x和y一定是整数,k最大就是a-b,只要遍历一遍a-b,取最终的gcd就可以了。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e6+5; const ll mod = 1e9+7; ll a[N]; int main(){ int _;cin>>_; while(_--) { int n;cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+1+n); ll res = 0; for(int i=2;i<=n;i++) res = __gcd(a[i]-a[i-1],res); if(res>=1) cout<<res<<endl; else cout<<-1<<endl; } return 0; }
|
总结:
列一个通式,然后化简得到数学式子,再由数学式推导题目的步骤。