我希望自己可以写出BFS
B
C - Linear Approximation (atcoder.jp)
求sigma abs(a[i]-i-b)的最小值。等价于在数轴上找一个点,是的这个点到每个a[i]-i的距离之和最小。
用a[i]-i当成新的a[i],之后用中位数来作为b(贪心)。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define inf 0x3f3f3f3f
#define pii pair<int,int>
int a[200005],b[200005];
int n;
int l,r,mid,ans;
void solve(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
a[i]-=i;
}
sort(a+1,a+n+1);
int k=n/2+1;
int s=a[k];
int sum=0;
for(int i=1;i<=n;i++){
a[i]-=s;
sum+=abs(a[i]);
}
cout<<sum<<endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);cout.tie(nullptr);
int oyyo=1;
//cin>>oyyo;
while(oyyo--) {
solve();
}
return 0;
}
C
所有数字最后都会变成1,进行第一次替换时,会直接替换K个,之后每次只会替换K-1个,因为要保证边界有1,所以第一次进行后,让剩余个数/2,如果存在余数(最后都要被替换),那么总替换数+1(向上取整);
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define inf 0x3f3f3f3f
#define pii pair<int,int>
void solve(){
int n,k;
cin>>n>>k;
for(int i=0;i<n;i++){
int x;
cin>>x;
}
int ans = 1;
n -= k;
ans += n / (k - 1);
n %= (k - 1);
if (n != 0) ans++;
cout<<ans<<endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);cout.tie(nullptr);
int oyyo=1;
//cin>>oyyo;
while(oyyo--) {
solve();
}
return 0;
}
G
贪心,双指针,遍历一遍S,记录当前最长连续相同字符串的起止位置,对起止位置的伤害序列进行排序(从大到小),取序列长度和K的最小值,再次遍历对sum进行累加操作。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define inf 0x3f3f3f3f
#define pii pair<int,int>
bool cmp(pair<char,int>a,pair<char,int>b){
return a.second>b.second;
}
void solve(){
int n,k;
cin>>n>>k;
vector<int>a(n);
for(int i=0;i<n;i++){
cin>>a[i];
}
string s;
cin>>s;
int sum=0;
for(int i=0,j=0;i<n and i<=j;i++){
while(s[j]==s[i] and j<n){
j++;
}
sort(a.begin()+i,a.begin()+j);
reverse(a.begin()+i,a.begin()+j);
for(int z=i;z<min(j,i+k);z++){
sum+=a[z];
}
i=j-1;
}
cout<<sum<<endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);cout.tie(nullptr);
int oyyo=1;
//cin>>oyyo;
while(oyyo--) {
solve();
}
return 0;
}
A
真希望想的出来。
要想把所有数变成 1,那有两种选择,一是直接变成 1,二是将这个数先变成其他某个数,再有那个数继续迭代下去。
Floyd算法求最短路径_floyd最短路径算法-CSDN博客
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define inf 0x3f3f3f3f
#define pii pair<int,int>
void solve(){
int h,w,c[10][10];
cin>>h>>w;
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
cin>>c[i][j];
}
}
for(int k=0;k<10;k++){
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
c[i][j]=min(c[i][j],c[i][k]+c[k][j]);
}
}
}
int ret=0;
for(int i=0;i<h;i++){
for(int j=0;j<w;j++){
int x;
cin>>x;
if(~x)
ret+=c[x][1];
}
}
cout<<ret<<endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);cout.tie(nullptr);
int oyyo=1;
//cin>>oyyo;
while(oyyo--) {
solve();
}
return 0;
}