2024 暑假友谊赛-热身1

我希望自己可以写出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

C - Minimization (atcoder.jp)

所有数字最后都会变成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

Problem - 1107C - Codeforces

贪心,双指针,遍历一遍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

真希望想的出来。

D - Wall

要想把所有数变成 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;
}

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值