wtpavssite

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

思维题

1.

image
这道题是通过计算来直接判断,思想是最多的颜色的灯隔开其他的灯,那么就有最多颜色的灯-1的空隙,只要剩下的灯的数量大于这些空隙那么最多颜色的灯就不会相邻。

2.

image
这道题要想到y字符串*2的k次方之后是相当于左移了k位,那么我们要最小化字符串的字典序,就需要在没有反转之前在低位尽可能多的0

3.海盗分赃

链接https://pintia.cn/problem-sets/2036338979402727424/exam/problems/type/7?problemSetProblemId=2036338979436281864

错的原因:

我一开始从只剩下两个海盗的时候进行推导,实际思路是对的,但是我看错了提的条件是同意的人大于半数,而不是半数及以上。所以推导错了,而且代码的实现方式并没有想到

正确的思路:

我们令一个数组q[i]代表有i个海盗的时候这个海盗分给自己的数量,那么q[i-1]就是代表下一个海盗分配给自己的数量,那么第一个海盗如果想要收买他,就必须给出比他自己分配还要多1的数量,那么我们开始递推,每一次都进行一次排序,把最小的需要的收买的数量排到前面,只需要收买足够的人就可以了。
先从只有一个海盗的时候入手,那么这个海盗一定是全部得到,两个海盗的时候,因为只要他被杀死,那么下一个海盗一定是得到全部,所以为了另一个海盗不杀死他,他就只能得到0,那么第三个海盗除了自己同意之外还需要收买1个人,那么找到只有两个海盗的时候最小的q给他+1那么就可以算出最小的花费

代码:

点击查看代码
#include<bits/stdc++.h>
using namespace std;

int main(){
	int d,p;
	cin>>d>>p;
	vector<int>q;
	q.push_back(d);
	q.push_back(0);
	for(int i=3;i<=p;i++){
		sort(q.begin(),q.end());
		int need=i/2;
		int can=d;
		for(int j=0;j<need;j++){
			q[j]=min(can,q[j]+1);
			can-=q[j];
		}
		for(int j=need;j<q.size();j++){
			q[j]=0;
		}
		q.push_back(can);
	}
	cout<<q.back()<<endl;
}
posted on 2026-01-25 20:58  wt_pav  阅读(13)  评论(0)    收藏  举报