Namomo Summer Camp 23 Day 1(GCPC2021)

Problem B: Brexiting and Brentering

签到

#include<bits/stdc++.h>

using i64 = long long;

using namespace std;

typedef pair<i64, i64> PII;

int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); string s,ans = "";
cin >> s;
int pos = s.size();
for(int i = s.size() - 1;i >= 0;i --){
if(s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u'){
pos = i + 1;
break;
}
} cout << s.substr(0,pos) + "ntry" << '\n'; return 0;
}

Problem C: Card Trading

买的人对于比意愿价格(他心中的最大接受价格)更低的成交价肯定也乐意买,而卖的人同理,对于比意愿出售价(心中最低接受价格)更高的成交价也乐意卖.所以我们将价格排序后,对卖商品的人做一个前缀和,买商品的人做一个后缀和,对于每一个价格,最大成交量就是处于这个价格的买家和卖家的最小意愿数

啊,这题还卡\(double\),一定要开\(longdouble\)

#include<bits/stdc++.h>

using i64 = long long;

using namespace std;

typedef pair<i64, i64> PII;

struct people {
long double value;
i64 buy, sale;
}; int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); int n;
cin >> n ;
vector<people> a(n);
for (int i = 0; i < n; i ++) {
cin >> a[i].value >> a[i].buy >> a[i].sale;
} sort(a.begin(), a.end(), [](people x, people y) {
return x.value < y.value;
}); vector<i64> s1(n), s2(n);
s2[n - 1] = a[n - 1].buy;
s1[0] = a[0].sale;
for (int i = 1; i < n; i ++)
s1[i] = s1[i - 1] + a[i].sale;
for (int i = n - 2; i >= 0; i --)
s2[i] = s2[i + 1] + a[i].buy; long double ans = 0, pos = -1;
for (int i = 0; i < n; i ++) {
if (min(s1[i], s2[i]) * a[i].value > ans) {
ans = min(s1[i], s2[i]) * a[i].value;
pos = i;
}
} if (pos == -1) {
puts("impossible");
} else
printf("%.2Lf %.2Lf\n", a[pos].value, ans); return 0;
}

Problem A: Amusement Arcade

要使得在\(n\)个位置中选一个位置(标为\(x\))后,其两边位置要刚好隔一个插一个人,且两边最边界不能是空格,其实无非是离\(x\)有\(2,4,8...\),为啥不能是\(6\)呢,因为它是每次取一半的位置,\(6\)取一半中间就会空出两个位置不符合要求,发现这个规律之后其实就是去看去掉\(x\)这个位置后剩余的位置能否凑成一个\(2^i\)或者两个数\(2^i\)和\(2^j\)的和

#include<bits/stdc++.h>

using i64 = long long;

using namespace std;

typedef pair<i64, i64> PII;

int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); i64 n;
cin >> n;
if (n == 1) {
cout << 1 << '\n';
return 0;
}
for (int i = 1; i < 63; i ++) {
for (int j = 1; j < 63; j ++) {
if ((1ll << i) + 1 == n || (1ll << i) + (1ll << j) + 1 == n) {
cout << (1ll << i) + 1 << '\n';
return 0;
}
}
} cout << "impossible\n"; return 0;
}

Problem M: Monty’s Hall

感觉自己好没用啊,都说是道小学奥数题(尊嘟假嘟o.O),可惜我是个大学生了

第一次选择的时候,我们开出宝箱的概率为\(\frac{S}{D}\),没开出宝箱的概率为\(\frac{D-S}{D}\),中间排除了\(E\)扇门,假如我们在第二次更换了\(L(0 \leq L \leq min(S,D-S-E))\)扇门,在原来中宝箱的概率上保证不会把宝箱换掉的概率就是只换掉了\(S\)扇门中的\(L\)扇非宝箱门,让宝箱在剩下的\(S-L\)扇门中,即再次中宝箱的概率为\(\frac{S-L}{S}\),而如果第一次没中,我们在第二次中宝箱的概率就是在剩下的\(D-S-E\)扇门中选择的\(L\)扇里含有宝箱,即\(\frac{L}{D-S-E}\),因此两次一共中宝箱的概率为\(\frac{S}{D} \times \frac{S-L}{S} + \frac{D-S}{D} \times \frac{L}{D-S-E}\),通分之后就是\(\frac{SD - S^2 - SE+LE}{D(D-S-E)}\),这里面只有\(L\)是未知的,我们只需要去枚举\(L\)就可以了,不过貌似\(L\)一定是在最大值或最小值处,这里我就懒得证了(orz)

#include<bits/stdc++.h>

using i64 = long long;

using namespace std;

typedef pair<i64, i64> PII;

int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); long double d,s,e,ans = 0;
cin >> d >> s >> e; for(int l = 0 ;l <= min(s,d - s - e);l ++)
ans = max((s * d - s * s - s * e + l * e )/(d * (d - s - e)),ans); cout << ans << '\n';
return 0;
}

Problem G: Grid Delivery

考虑贪心的做法,第一层先让司机拿完所有的货物,然后向下延伸,后面有货物就继续往后走,如果前面有货物,就再派一辆司机,后面几层同理,二分就是去找上一层小于等于当前货物位置的司机或者当前位置前面的司机

#include<bits/stdc++.h>

using i64 = long long;

using namespace std;

typedef pair<i64, i64> PII;

int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); int n, m;
cin >> n >> m;
vector<string> g(n);
for (auto &i : g) cin >> i; multiset<int> ans;
ans.insert(-666);//防止越界
for (int i = 0; i < n; i ++) {
for (int j = 0; j < m; j ++) {
if (g[i][j] == 'C') {
auto t = prev(ans.upper_bound(j));
if(*t == -666) ans.insert(j);
else ans.erase(t), ans.insert(j);
}
}
} cout << ans.size() - 1 << '\n';
return 0;
}

Problem H: Hectic Harbour II

可以把这两个栈想象成一个顶部对接的链表,比如例\(2\)就可以看成是\(2,4,0,1,5,3,6\),第一次把\(1\)拿走,它的左边有\(0\),答案\(+1\),第二拿走\(2\),左右没\(0\),跳过,拿走\(3\),左右无\(0\),跳过,拿走\(4\),右边有\(0\),答案\(+1\),拿走\(5\),左边有\(0\),答案\(+1\),拿走\(6\),左边有\(0\),答案\(+1\),更直观点就是(黑体表示要拿走的数字):\(2,4,0,\textbf{1},5,3,6 \rightarrow \textbf{2},4,0,5,3,6 \rightarrow 4,0,5,\textbf{3},6 \rightarrow \textbf{4},0,5,6 \rightarrow 0,\textbf{5},6 \rightarrow 0,\textbf{6}\)

然后你就会发现,其实这就是从\(0\)向两边求上升序列的长度

#include<bits/stdc++.h>

using i64 = long long;

using namespace std;

typedef pair<i64, i64> PII;

int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); int n, s1, s2;
cin >> n >> s1 >> s2;
vector<int> s(n + 1);
for (int i = 0; i < s1; i ++)
cin >> s[i];
for (int i = n; i >= s1; i --)
cin >> s[i]; i64 ans = 0;
auto t = find(s.begin(), s.end(), 0) - s.begin();
int ma = 0;
for (int i = t; i <= n; i ++){
if (s[i] > ma){
ans ++;
ma = s[i];
}
}
ma = 0;
for (int j = t; j >= 0; j --){
if (s[j] > ma){
ans ++;
ma = s[j];
}
} cout << ans << '\n'; return 0;
}

Namomo Summer Camp 23 Day 1(GCPC2021)的更多相关文章

  1. bellman-ford 单源最短路问题 图解

    ​ 核心思想:松弛操作 对于边(u,v),用dist(u)和(u,v)的和尝试更新dist(v): dist(v) = min(dist(v) , dist(u)+l(u,v) 注:dist(i)为源 ...

  2. Prim 最小生成树 图解

    ​ 什么是生成树 子图:G=<V,E>,G'=<V', E'>,为两个图(V为点集,即图中点的集合,E为边集),如果V'是V的子集且E'是E的子集,则G'是G的子图. 如果V' ...

  3. 2020 CCPC Wannafly Winter Camp Day1 C. 染色图

    2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...

  4. Java开发中的23种设计模式详解

    [放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...

  5. ILJMALL project过程中遇到Fragment嵌套问题:IllegalArgumentException: Binary XML file line #23: Duplicate id

    出现场景:当点击"分类"再返回"首页"时,发生error退出   BUG描述:Caused by: java.lang.IllegalArgumentExcep ...

  6. CSharpGL(23)用ComputeShader实现一个简单的ParticleSimulator

    CSharpGL(23)用ComputeShader实现一个简单的ParticleSimulator 我还没有用过Compute Shader,所以现在把红宝书里的例子拿来了,加入CSharpGL中. ...

  7. ABP(现代ASP.NET样板开发框架)系列之23、ABP展现层——异常处理

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之23.ABP展现层——异常处理 ABP是“ASP.NET Boilerplate Project (ASP.NET ...

  8. Java开发中的23种设计模式详解(转)

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  9. C#得到某月最后一天晚上23:59:59和某月第一天00:00:00

    项目需求: 某学校订单截止操作时间的上一个月最后一天晚上23:59:59 为止所有支付的订单统计: 代码: /// <summary> /// 通过学校和截止时间得到订单 /// < ...

  10. C#开发微信门户及应用(23)-微信小店商品管理接口的封装和测试

    在上篇<C#开发微信门户及应用(22)-微信小店的开发和使用>里面介绍了一些微信小店的基础知识,以及对应的对象模型,本篇继续微信小店的主题,介绍其中API接口的封装和测试使用.微信小店的相 ...

随机推荐

  1. C# .NET core Avalonia 11.0版本,发布linux和MAC的简单记录

    .net core 7.0+centos 7.0 cetnos目前运行在hyper V虚拟机里 虚拟机部署的注意事项 1 需要配置网络环境, 确保在同一局域网下 如果sftp无法连接 ctrl+shi ...

  2. echarts 各种特效图

    饼图标签展示数值 配置项: option = { title: { text: '项目时间分布', left: 'center' }, tooltip: { trigger: 'item', form ...

  3. GuavaCache、EVCache、Tair、Aerospike 缓存框架比较

    Guava Cache.EVCache.Tair.Aerospike 是不同类型的缓存解决方案,它们各有特点和应用场景.下面我会逐一分析这些缓存系统的优势.应用场景,并提供一些基本的代码示例. Gua ...

  4. Node.js - fs.path模块

    首先我有话说,是谁说的学完ajax就可以去vue了,太天真了我,学会js钻出来个ajax,学完ajax钻出来个node.js这一步步的,当然node不会学到太深入把表面的认识一下就可以了,这之后可能更 ...

  5. Linux 提权-SUID/SGID_1

    本文通过 Google 翻译 SUID | SGID Part-1 – Linux Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释 ...

  6. CosyVoice多语言、音色和情感控制模型,one-shot零样本语音克隆模型本地部署(Win/Mac),通义实验室开源

    近日,阿里通义实验室开源了CosyVoice语音模型,它支持自然语音生成,支持多语言.音色和情感控制,在多语言语音生成.零样本语音生成.跨语言声音合成和指令执行能力方面表现卓越. CosyVoice采 ...

  7. new操作符具体干了什么呢?

    new操作符的作用如下: 1.创建一个空对象2.由this变量引用该对象3.该对象继承该函数的原型4.把属性和方法加入到this引用的对象中5.新创建的对象由this引用,最后隐式地返回this.过程 ...

  8. win10彻底关闭windows defender,解决无故占用大量CPU问题

    win10彻底关闭defender的方法 首先右键开始菜单按钮,点击"运行",输入"gpedit.msc",打开"本地组策略编辑器". 依次 ...

  9. 聊天chat封装

    说明:连接状态,客户端ID,在线状态,连接中,当前聊天会话ID,当前聊天对象ID,总未读数, 聊天功能实现首先要保证当前用户已经登录状态 监听登录时更新会话列表 监听退出时更新会话列表 发起聊天的时候 ...

  10. 咬文嚼图式的介绍二叉树、B树/B-树

    前言 因为本人天资愚钝,所以总喜欢将抽象化的事务具象化表达.对于各类眼花缭乱的树,只需要认知到它们只是一种数据结构,类似数组,切片,列表,映射等这些耳熟能详的词汇.对于一个数据结构而言,无非就是增删改 ...