CodeForce刷题表

Day6

1607C - Minimum Extraction

题意:

给定一个数组,每次选择最小的数删除,其他的所有数减去这个数。

问删除的数最大值是多少。

思路:

只需要排好序,默认最大值是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;
}

总结:

同时减去(加上)一个数可以某种意义上认为都没有减(加)。

1593D1 - All are Same

题意:

找到一个数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;
}

总结:

列一个通式,然后化简得到数学式子,再由数学式推导题目的步骤。