思维题
1.

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

这道题要想到y字符串*2的k次方之后是相当于左移了k位,那么我们要最小化字符串的字典序,就需要在没有反转之前在低位尽可能多的0
3.海盗分赃
错的原因:
我一开始从只剩下两个海盗的时候进行推导,实际思路是对的,但是我看错了提的条件是同意的人大于半数,而不是半数及以上。所以推导错了,而且代码的实现方式并没有想到
正确的思路:
我们令一个数组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;
}
浙公网安备 33010602011771号