A
拉票,两种方式:
1、花钱买
2、mi人投之后会跟风
有点像背包问题?
贪心应该也可以
dp吧。占坑
多想想,别一不会就是dp,其实简单的dp应该也能写出来
贪心+stl
这个思路好神奇,太厉害了
priority_queue<int, vector<int>, greater<int>> Q;
for(int i = n; i >= 0; i--){//i指需要的票数
int len = v[i].size();
for(int j = 0; j < len; j++){
Q.push(v[i][j]);//把需要这些票数的人都加进优先队列
//之前的都已经投票
}
while(Q.size() > n - i){
ans += Q.top();
Q.pop();
}
————————————————
版权声明:本文为CSDN博主「error311」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/error311/article/details/102757350
B
可以交换相邻的奇偶性不同的两个数
求最小结果
贪心:相同属性数字之间的顺序没法变
水题
无语了
char写成了int
数组换成vector也不行
无语了,字符数组变成字符串对象就好了
莫名其妙
mmp
C
重复两次就是坏了
水题
不解释
D
发薪水,使中位数最大
又是背包问题?
贪心应该是不行
又是dp?
//水平洼,看啥不会的都是dp
struct node{
ll l,r;
node(ll li = 0,ll ri = 0) {
l = li;
r = ri;
}
bool operator < (const node & rhs) const {
if(l == rhs.l) return r > rhs.r;
return l > rhs.l;
//下限排序,下限相同看上限
}
}a[maxn];
int main() {
scanf("%d",&t);
while(t--) {
scanf("%lld%lld",&n,&s);
for(int i = 1; i <= n; i++) {
scanf("%lld%lld",&a[i].l,&a[i].r);
}
sort(a + 1,a + n + 1);
//傻了,正面做不出来,倒推试试行不行不就可以了
ll l = 0,r = s + 1;
while(l < r) {
ll mid = l + r >> 1;
ll tmp = 0,cnt = 0;
for(int i = 1; i <= n; i++) {
if(mid < a[i].l){
tmp += a[i].l;
cnt++;
} else if(a[i].l <= mid && mid <= a[i].r) {
if(cnt < (n + 1) / 2) tmp += mid,cnt++;
else tmp += a[i].l;
} else if(a[i].r < mid) tmp += a[i].l;
}
if(cnt >= (n + 1) / 2 && tmp <= s) l = mid + 1;
else r = mid;
}
printf("%lld\n",l - 1);
}
————————————————
版权声明:本文为CSDN博主「猝死在学ACM的路上」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41997978/article/details/102829654
E
篱笆,红色一个,最长,之前递减,之后递增
计算能做的某个周长的篱笆个数
NTT(Number Theoretic Transform)
占坑
F
好几个01串,任意交换,求能得到的回文串的最大数;
想吃串了
可以无限交换,那视为把x个1,y个0分配就行,贪心算法,优先满足短的。需要奇数个数,尽量破坏x,y中的的奇数,因为偶数可以随意分成奇数,但剩下一个1,一个0不能凑偶数
无语了,睡多了吧!贪心都搞不定了
if (s1 % 2 == 0 && s1 >= 2) {
if (num1 % 2 == 0 && num0 % 2 == 0) ans = n;
if (num1 % 2 == 1 && num0 % 2 == 1) ans = n;
if ((num1 % 2 == 0 && num0 % 2 == 1) || (num1 % 2 == 1 && num0 % 2 == 0)) ans = n - 1;
} else {
if (num1 % 2 == 0 && num0 % 2 == 0) ans = n - 1;
if (num1 % 2 == 1 && num0 % 2 == 1) ans = n - 1;
if ((num1 % 2 == 0 && num0 % 2 == 1) || (num1 % 2 == 1 && num0 % 2 == 0)) ans = n;
}
竟然去推规律,唉
利用贪心来模拟啊
如果只有1个奇数串,则只能有一种数字是奇数-
如果奇数串的数量是奇数而且大于1,那么只有在只有1种字符数量为奇数的时候可行
如果没有奇数串那么两种数字都不能出现奇数
如果奇数串的数量不为1且大于0, 那么只要两种数字的数量都是偶数就行
G
hard version