SMU Summer 2024 div2 1st
提示:这里可以添加本文要记录的大概内容:
一、前言
暑假第一周训练,直接九九六了,俩个专题题单共四十题,每天一场个人赛俩到三个小时,还有对应的题单课程和题解,都在前面几篇博客里了反正。就不一一放链接了,然后酌情放几题没做出来的,着重总结一下算法学习和题单的题吧。
二、算法
1.二分算法
二分算法其实我写过好几次了,但每次写相对应的题都会遇到不会的,希望这次真的是最后一次写吧。
//二分模板
#include<bits/stdc++.h>
using namespace std;
#define int long long
bool check(int x) {
//具体判断的条件
return ;
//判断是否符合
}
signed main() {
int l,r;
while (l < r) {
int mid = (l+r+1)/2;
if(check(mid))l = mid;
else r = mid - 1;
//int mid = (l+r)/2;
//if(check(mid))r = mid;
//else l = mid + 1;
}//mid是否加1取决于输出l和r的判断
//以非注释部分为例,l直接等于mid,如果不加1,直接取符合条件的偏小数,可能陷入死循环。
cout << l << endl;
//因为l是最后的符合条件的数字。
return 0;
//小tips,必须返回不然会boom,爆!
}
<1> ([CQOI2010])
扑克牌
a不是什么难题,就是一道典型题变式,拿出来看看。
题解:
你有n种牌,第i种牌的数目为ci。另外有一种特殊的牌:joker,它的数目是m。你可以用每种牌各一张来组成一套牌,也可以用一张joker和除了某一种牌以外的其他牌各一张组成1套牌。最多组成多少组牌。
x代表能否组成这么多牌,少的牌需要joker来代替。具体见代码。
代码:
#include<bits/stdc++.h>
using namespace std;
long long n,m;
long long c[55];
bool solve(long long x) {
long long ans = 0;
for (int i = 0; i < n; i++) {
if (c[i] < x)ans+=(x-c[i]);
}
if (ans <= x && ans <= m)return true;
else return false;
}
int main() {
cin >> n >> m;
long long ma = 0;
for (int i = 0; i < n; i++) {
cin >> c[i];
if (c[i] > ma)ma = c[i];
}

最低0.47元/天 解锁文章
615

被折叠的 条评论
为什么被折叠?



