【Codeforces】Round 957 (Div. 3)_B. Angry Monk

作者:指针不指南吗
专栏:算法刷题

🐾或许会很慢,但是不可以停下来🐾

题目

题目链接

在这里插入图片描述
在这里插入图片描述

题解

try1代码

我的思路:单纯模拟
循环,每次取数组中最小的数,判断是否为1
为1,和最大的数合并
不为1,把最大数分成1和v[d-1]-1

res:前两个测试点过了,第三个超时


#include<bits/stdc++.h>
using namespace std;
 
const int N=1E5+10;
 
vector<int> v;
 
bool cmp(int a,int b){
	return a>b;
}
 
int main(){
	
	int T;
	cin>>T;
	
	while(T--){
		int n,k;
		//cin>>n>>k;
		scanf("%d %d",&n,&k);
		
		int cnt=0;
		
		v.clear();
		
		for(int i=0;i<k;i++)
		{
			int x;
			scanf("%d",&x);
			v.push_back(x);
		}
			
		sort(v.begin(),v.end(),cmp);
		
		while(v.size()!=1){
			
			
			int d=v.size();
			if(v[d-1]==1){
				v[0]+=1;
				v.pop_back();
			}else{
				v.push_back(v[d-1]-1);
				v[d-1]=1;
				sort(v.begin(),v.end(),cmp);
			}
			
			cnt++;
		}
	  printf("%d\n",cnt);
	}
 
    return 0;
}

正确题解

贪心算法
除了最后一块,剩下的全部分解成1
分解次数虽然增加了,但是合并少了(否则合并更加复杂)
cnt+=v[i]*2-1
每一块需要分解成v[i]-1
合并成成都为n的需要k-1 即v[i]-1,由于还需要和其他块合并所以+1 即v[i]
即:v[i]-1+(v[i])=2*v[i]-1

贪心策略的解释

贪心策略在这里的应用是:每次操作都尽可能减少剩余的马铃薯块数量。这样做的好处是:

  1. 减少合并操作的次数:每次合并操作都会减少一块马铃薯,因此减少剩余的马铃薯块数量是减少合并操作次数的关键。
  2. 灵活性:将每块马铃薯分解成多个1米长的小块,可以更灵活地进行合并操作,最终达到目标长度 ( n )。

为什么不是直接合并

直接将每块马铃薯与一块1米长的马铃薯合并的想法看似简单,但实际上并不是最优的。原因如下:

  • 合并次数:如果每块马铃薯都直接与一块1米长的马铃薯合并,合并次数会等于马铃薯块的总数 ( k )。这并不是最优的,因为合并次数可以更少。
  • 操作次数:将每块马铃薯分解成多个1米长的小块,虽然看起来增加了分解操作的次数,但实际上减少了合并操作的次数。最终的总操作次数会减少。
#include<bits/stdc++.h>
using namespace std;

const int N=1E5+10;

vector<int> v;

bool cmp(int a,int b){
	return a>b;
}

int main(){
	
	int T;
	cin>>T;
	
	while(T--){
		int n,k;
		//cin>>n>>k;
		scanf("%d %d",&n,&k);
		
		int cnt=0;
		
		v.clear();
		
		for(int i=0;i<k;i++)
		{
			int x;
			scanf("%d",&x);
			v.push_back(x);
		}
		
		sort(v.begin(),v.end());  //保证最大的在最后 
			
		for(int i=0;i<v.size()-1;i++){  //边界 最后一个不用分解 直接+1即可 
			cnt+=v[i]*2-1;  
		}
		
	  printf("%d\n",cnt);
	}

    return 0;
}

总结

认为这种题比较抽象,想不到他这种解法
将复杂的问题简单化
贪心算法,取局部最优,从而实现整体最优

Alt

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Codeforces Round 894 (Div. 3) 是一个Codeforces举办的比赛,是第894轮的Div. 3级别比赛。它包含了一系列题目,其中包括题目E. Kolya and Movie Theatre。 根据题目描述,E. Kolya and Movie Theatre问题要求我们给定两个字符串,通过三种操作来让字符串a等于字符串b。这三种操作分别为:交换a中相同位置的字符、交换a中对称位置的字符、交换b中对称位置的字符。我们需要先进行一次预处理,替换a中的字符,然后进行上述三种操作,最终得到a等于b的结果。我们需要计算预处理操作的次数。 根据引用的讨论,当且仅当b[i]==b[n-i-1]时,如果a[i]!=a[n-i-1],需要进行一次操作;否则不需要操作。所以我们可以遍历字符串b的前半部分,判断对应位置的字符是否与后半部分对称,并统计需要进行操作的次数。 以上就是Codeforces Round 894 (Div. 3)的简要说明和题目E. Kolya and Movie Theatre的要求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Codeforces Round #498 (Div. 3) (A+B+C+D+E+F)](https://blog.csdn.net/qq_46030630/article/details/108804114)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Codeforces Round 894 (Div. 3)A~E题解](https://blog.csdn.net/gyeolhada/article/details/132491891)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

指针不指南吗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值