Cf #823 Div.2

文章目录

  • Cf #823 Div.2
    • [A. Planets](https://codeforces.com/contest/1730/problem/A)
    • [B. Meeting on the Line](https://codeforces.com/contest/1730/problem/B)
    • [C. Minimum Notation](https://codeforces.com/contest/1730/problem/C)

A. Planets

  • 题意

    • 有n个星星,第i个颗星星在第a[i]环绕轨道上,用以下两种操作,问最小消耗
    • 操作1:消除单个星星,消耗1。操作2:消除整个轨道的星星,消耗c
  • 题解

    • 对于每一个轨道去考虑消除,x轨道中的星星个数大于c则使用操作2,否则用操作1,保证每一个轨道的消耗最少,贪心正确
  • 代码

#include <iostream>
#include <map>using namespace std;void solve() {int n,c,x; cin>>n>>c;map<int,int> h;//h[轨道]->轨道中星星数量for(int i=0;i<n;i++) {cin>>x;h[x]++;}long long ans=0;for(auto t:h) {//map的遍历方法if(t.second<=c) ans+=t.second;else ans+=c;}cout<<ans<<'\n';
}int main() {int t;cin>>t;while(t--) solve();return 0;
}

B. Meeting on the Line

  • 题意

    • x轴上有n个人,每个人到达某一点的时间为abs(x[i]-x)+t[i],其中x[i]为第i个人的坐标,t[i]表示第i个人穿衣服所需要的时间。
    • 找到一个位置pos,使得最晚到达pos的人的时间最小
  • 题解

    • 方法一:二分;二分答案时间(最晚到达pos的最小时间),对于每个时间检验每个人能到达的区间,所有区间有交集意味着答案位置在交集区间中,也就是说答案时间其具有单调性,时间短会使得有人不能到达pos(没有交集区间),时间越长交集区间会更长,直到二分至交集区间缩在一个长度可视作一个点的区间即找到答案

    • 方法二:贪心;当所有的t[i]=0时,那么容易得到取pos=(x_max+x_min)/2时,使得最晚到达pos的人的时间最小。而将(xi,ti)换成两个点(xi-ti,0)和(xi+ti,0),易证得最终答案不变,所以只需要将所n个点用以上方法换成2n个点,取最大最小的平均值即为pos

      证明:用(xi-ti,0)和(xi+ti,0)替换(xi,ti),答案不变假设答案为pos,pos>xi,那么答案时间为ti+pos-xi
      对于(xi-ti,0),(xi+ti,0)来说其答案时间为pos-(xi-ti)=ti+pos-xi,abs(pos-xi-ti),其中第一个时间与答案时间相同,第二个时间一定小于答案时间,故不影响答案对于pos<xi同理
      
  • 代码

    方法一:二分

#include <iostream>
#include <cmath>using namespace std;
const int N=1e5+10;int n;
double x[N],t[N],ans;bool check(double mid) {//检验答案时间是否能让所有人到达某一个区域double l=-2e8,r=2e8;for(int i=0;i<n;i++) {if(mid<t[i]) return false;//剪枝else {l=max(l,x[i]-mid+t[i]);r=min(r,x[i]+mid-t[i]);}//最右的左端点,最左的有端点,贪心找到这样一个区间}ans=l;//ans也可以取r,因为最终l,r缩在一点return r>=l-1e-8;//是否有交集,r<l意味着没有交集
}void solve() {cin>>n;for(int i=0;i<n;i++) cin>>x[i];for(int i=0;i<n;i++) cin>>t[i];double l=0,r=2e8;//时间while(r-l>1e-7) {//二分实数时间double mid=(l+r)/2;if(check(mid)) r=mid;else l=mid;}printf("%.8lf\n",fabs(ans));
}int main() {int t;cin>>t;while(t--) solve();return 0;
}

方法二:贪心,O(n)

#include <iostream>using namespace std;
const int N=1e5+10;
double x[N],t[N];void solve() {int n; cin>>n;for(int i=0;i<n;i++) cin>>x[i];for(int i=0;i<n;i++) cin>>t[i];double mi=1e9,mx=0;for(int i=0;i<n;i++)mi=min(l,x[i]-t[i]),mx=max(r,x[i]+t[i]);printf("%.8lf\n",(mi+mx)/2);
}int main() {int t;cin>>t;while(t--) solve();return 0;
}

C. Minimum Notation

  • 题意

    • 给定一个只含有0~9的字符串s,可以进行操作:选择第i位将其删除,同时在任意位置插入一个字符x=min(‘9’,s[i]+1)
    • 输出字符串s可以的得到的字典序最小的字符串
  • 题解

    • 贪心;当s所有字符单调不递减时,不需要进行任何操作,因为任意一个操作都会使得其中一个字符+1,导致字典序变大。
    • 所以相反的,一旦某个位置递减了,那么该段当中的数都需要进行操作,位置自动放入最佳位置,不需要管。而正向操作记录较为麻烦,所以直接逆序操作,记录一个当前最小的字符x,如果遍历字符大于x,那么操作,s[i]+1数量++,否则不操作,输出的s[i]数量++。因为位置肯定能够保证放在最佳位置,所以最后直接按0~9顺序输出
  • 代码

#include <iostream>
#include <cstring>using namespace std;void solve() {string s;cin>>s;int n=s.length();char x='9';int cnt[15]={0};for(int i=n-1;i>=0;i--) {//逆序操作if(s[i]<=x) {x=s[i];cnt[s[i]-'0']++;}else cnt[min(9,s[i]-'0'+1)]++;}for(int i=0;i<10;i++) cout<<string(cnt[i],'0'+i);puts("");
}int main() {int t;cin>>t;while(t--) solve();return 0;
}

cf #823 Div.2(A~C)相关推荐

  1. CF #366(div.2) C 模拟,思维

    CF #366(div.2)  C.  Thor 题意:一个手机n个联系人,有q个操作.每次给出ty和ai,如ty==1,表示收到ai的一条信息:如ty==2,表示将ai发的信息都看掉:如ty==3, ...

  2. CF #371 (Div. 2) C、map标记

    1.CF #371 (Div. 2)   C. Sonya and Queries  map应用,也可用trie 2.总结:一开始直接用数组遍历,果断T了一发 题意:t个数,奇变1,偶变0,然后与问的 ...

  3. cf #818 Div.2(A~C)

    Cf #818 Div.2 文章目录 Cf #818 Div.2 [A. Madoka and Strange Thoughts](https://codeforces.com/contest/171 ...

  4. CF #683 div.2

    CF #683 div.2 目前 ABCD A. Add Candies B. Numbers Box C. Knapsack D. Catching Cheaters 结尾 A. Add Candi ...

  5. CF#764(div.3A~D)dp进阶

    CF#764(div.3A~D)&&dp进阶 CF#764(div.3) Problem - A - Codeforces 题意 一个数列,每次操作可以使这个数列中的任何数加1,问最少 ...

  6. CF #764 Div.3(B ~D)

    CF #764 Div.3 B题 Make AP 给定a b c 使其中一个数 乘 任意正整数m 问是否能构成成差数列 我们可以想到等差数列的性质 2b=a+c2b = a + c 2b=a+c 思路 ...

  7. cf #825 Div.2(A~C2)

    Cf #825 Div.2 文章目录 Cf #825 Div.2 [A. Make A Equal to B](https://codeforces.com/contest/1736/problem/ ...

  8. edu cf #138 Div.2(A~D)

    edu cf #138 Div.2 文章目录 edu cf #138 Div.2 [A. Cowardly Rooks](https://codeforces.com/contest/1749/pro ...

  9. CF#320 Div.2 总结

    比赛网址:cf#320 Div.2 晚上11点开始的比赛,持续2个半小时.结束时有两道题题过了预测数据,分时是A题和C题. 比赛开始的时候,理所当然地从A题开始看起.A题比较容易,稍微分析一下就可以看 ...

最新文章

  1. freemind的一个大bug,一周的数据啊
  2. c语言while退出无限循环,请教:为什么我用while(!feof(fp))时会出现无限循环????...
  3. c 引用mysql报错_安装TPCC-MySQL报错
  4. C# 数据结构 之 堆栈和队列
  5. Python基础语法:数据类型、进制转换、转义字符、字符编码、整数与浮点数运算规则、布尔型运算规则
  6. 重构-改善既有代码的设计(1)
  7. 嵌入式Linux系统的构成和启动总结
  8. 550什么意思_布草知识 | 都是羽绒,为什么价格大不同?
  9. 46muduo库使用示例(五)
  10. 软件定义边界(SDP)简介
  11. ios王者荣耀服务器维护31号,王者荣耀iOS还在维护怎么回事 3月31日王者荣耀IOS什么时候能上...
  12. Android华为推送踩坑,极光推送集成华为遇到的坑?
  13. C或C++中的isalpha、isalnum、islower 和 isupper函数的详解
  14. 3dsmax-角色骨骼
  15. Android开发:开源库集合
  16. Acrel-2000Z变电站综合自动化系统
  17. Python 三维网格体素化
  18. 中国省市区县行政编码sql脚本
  19. ERNIE: Enhanced Representation through Knowledge Integration(百度)论文翻译
  20. originPro将坐标以百分比的方式显示

热门文章

  1. 微信中下载app无反应 微信浏览器无法apk下载链接方案
  2. python笔记 - urllib模块(二十一)
  3. 初学风水-某商务中心店铺
  4. 二战字节跳动成功上岸,准备了小半年,拿27k也算不上很高吧~
  5. python实现图像渲染
  6. [nRF51822] 1、一个简单的nRF51822驱动的天马4线SPI-1.77寸LCD彩屏DEMO
  7. Gulp老矣 尚能饭否
  8. 世界杯 叮当 机器人 树莓派_世界杯营销大战,移动互联网谁捧起了大力神杯
  9. PHP反序列化字符串逃逸
  10. DDR3及DDR4的传输带宽