Codeforces Round #822 (Div. 2)
A
思路
观察样例发现,要使花费最小,则需要使得边长位于三个数之间,因此将序列排序,而花费则为 a i − a i − 1 + a i + 1 − a i = a i + 1 − a i − 1 a_i-a_{i-1}+a_{i+1}-a_i=a_{i+1}-a_{i-1} ai−ai−1+ai+1−ai=ai+1−ai−1
代码
#include<iostream>
#include <algorithm>
using namespace std;
int main(){
int T;
cin>>T;
while(T--){
int n;
cin>>n;
int a[305];
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
int ans=1e9+5;
for(int i=1;i<n-1;i++){
ans = min(ans,a[i+1]-a[i-1]);
}
cout<<ans<<endl;
}
return 0;
}
B
思路
画到n=5,发现,只要保证两侧都是点亮的,即可。
代码
#include <iostream>
using namespace std;
int main(){
int T;
cin>>T;
while(T--){
int n;
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
if (j == 1 || j==i)
cout << "1 ";
else
cout << "0 ";
}
cout<<endl;
}
}
return 0;
}
C
思路
每次移除最小的倍数,从小往大逐一移除
#include <iostream>
using namespace std;
typedef long long ll;
void sol(){
int n;
cin >> n;
string s;
cin >> s;
int *cost = new int[n + 1];
for (int i = n; i >= 1; i--)
{
for (int j = i; j <= n; j += i)
{
if (s[j-1]=='1')
break;
cost[j] = i;
}
}
ll ans = 0;
for (int i = 1; i <= n; i++)
if (s[i-1]=='0')
ans += cost[i];
cout << ans << endl;
}
int main(){
int T;
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>T;
while(T--){
sol();
}
return 0;
}