A. Coffee Break

题意:每天有m小时,你喝咖啡需要花一小时,你想在n个时刻都喝过一次咖啡,老板规定连续喝咖啡的间隔必须是d以上,求最少需要多少天才能喝够n次咖啡,并输出每个时刻第几天喝。

题解:map+优先队列,用map将愿意喝咖啡的时间喝在第几天喝咖啡映射起来,优先队列遍历每个时刻和上一次喝的时间间隔是否大于d,若大于d,表示可以同一天喝,否则就在下一天喝

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<math.h>
  4. #include<string>
  5. #include<string.h>
  6. #include<vector>
  7. #include<utility>
  8. #include<map>
  9. #include<queue>
  10. using namespace std;
  11. map<int,int>m;
  12. priority_queue<int,vector<int>,greater<int> >p;
  13. int a[],b[];
  14. int main()
  15. {
  16. int n,t,d;
  17. scanf("%d%d%d",&n,&t,&d);
  18. for(int i=;i<n;i++)
  19. {
  20. scanf("%d",&b[i]);
  21. a[i]=b[i];
  22. }
  23. sort(a,a+n);
  24. m[a[]]=;//最小的时间点一定是第一天就可以喝
  25. p.push(a[]);
  26. int cnt=;
  27. for(int i=;i<n;i++)
  28. {
  29. int now=p.top();
  30. if(a[i]-now>d)
  31. {
  32. m[a[i]]=m[now];//可以同一天喝
  33. p.pop();
  34. }
  35. else
  36. m[a[i]]=++cnt;//只能下一天喝
  37. p.push(a[i]);
  38. }
  39. printf("%d\n",cnt);
  40. for(int i=;i<n;i++)
  41. {
  42. if(i==)
  43. printf("%d",m[b[i]]);
  44. else
  45. printf(" %d",m[b[i]]);
  46. }
  47. printf("\n");
  48. return ;
  49. }

B

题意:有nn个上升气流带,在这里飞行不会下降,否则每前进一会下降1格。求出从某个起点能飞的尽可能远的距离。

题解:起点肯定是某个区间的起点,但枚举起点显然会超时,但显然从当前起点向前可以穿过的区间数和其花费是单调递增,所以处理出前缀和后枚举起点二分终点即可获得答案

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<math.h>
  4. #include<string>
  5. #include<string.h>
  6. #include<vector>
  7. #include<utility>
  8. #include<map>
  9. #include<queue>
  10. #define mx 0x3f3f3f3f
  11. #define ll long long
  12. using namespace std;
  13. ll start[],sum[],len[],len2[];
  14. int main()
  15. {
  16. ll n,h;
  17. scanf("%lld%lld",&n,&h);
  18. for(int i=;i<=n;i++)
  19. {
  20. ll l,r;
  21. scanf("%lld%lld",&l,&r);
  22. start[i]=l;
  23. len[i]=r-l;//区间长度
  24. }
  25. for(int i=;i<=n-;i++)
  26. len2[i]=start[i+]-(start[i]+len[i]);//两个区间之间的间隔长度
  27.  
  28. len2[n]=mx;
  29. for(int i=;i<=n;i++)
  30. sum[i]=sum[i-]+len2[i];//前缀和
  31. ll ans=;
  32. for(int i=;i<=n;i++)
  33. {
  34. ll l=i,r=n,mid,pos;
  35. while(l<=r)
  36. {
  37. mid=l+(r-l)/;
  38. if(sum[mid]-sum[i-]>=h)
  39. {
  40. pos=mid;
  41. r=mid-;
  42. }
  43. else
  44. l=mid+;
  45. }
  46. ll hh=h-(sum[pos-]-sum[i-]);//最后一段飘的距离
  47. ans=max(ans,start[pos]-start[i]+len[pos]+hh);
  48. }
  49. printf("%lld\n",ans);
  50. return ;
  51.  
  52. }

C. Bacteria

题意:碗里有n个细菌,只有重量相同的细菌才可以合并在一起,合并后的细菌为两个细菌之后,为了把碗里的所有细菌合并成一个细菌,问最少还要向碗里增加几个细菌?若最后不能合并成一个细菌,输出-1,否则输出最少要加入的细菌个数

题解:优先队列逐个处理即可

  1. #include<iostream>
  2. #include<string>
  3. #include<string.h>
  4. #include<algorithm>
  5. #include<map>
  6. #include<queue>
  7. #define mx 0x3f3f3f3f
  8. #define ll long long
  9. using namespace std;
  10. ll gcd(ll a, ll b)//最大公约数
  11. {
  12. return b == ? a : gcd(b, a % b);
  13. }
  14. ll lcm(ll a, ll b)//最小公倍数
  15. {
  16. return a / gcd(a, b) * b;
  17. }
  18. priority_queue<ll,vector<ll>,greater<ll> > p;
  19. int main()
  20. {
  21. ll n;
  22. scanf("%lld",&n);
  23. for(int i=;i<n;i++)
  24. {
  25. ll temp;
  26. scanf("%lld",&temp);
  27. p.push(temp);
  28. }
  29. ll flag=,cnt=;
  30. while(p.size()!=)
  31. {
  32. ll now=p.top();
  33. p.pop();
  34. if(p.size()==)
  35. {
  36. if(lcm(now,p.top())!=p.top())
  37. {
  38. flag=;
  39. break;
  40. }
  41. }
  42. if(now==p.top())
  43. {
  44. now=now+p.top();
  45. p.pop();
  46. p.push(now);
  47. }
  48. else
  49. {
  50. cnt++;
  51. now=now*;
  52. p.push(now);
  53. }
  54. }
  55. if(flag==)
  56. printf("-1\n");
  57. else
  58. printf("%lld\n",cnt);
  59. return ;
  60. }

D、

题意:给你nn个数,你要给出不同的组合(a,b)(a,b)使得a∗b=A[i]a∗b=A[i],不能重复,但是(a,b)(a,b)和(b,a)(b,a)不同

题解:按照输入顺序枚举每一个数的因子,枚举到一个因子num[i]之后就退出,同时用vis[]反向标记一下这个数,下一次再次遇到这个数,就从上一次的因子num[i]+1继续枚举

用pair数组保存每一个数的一对因子

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<math.h>
  4. #include<string>
  5. #include<string.h>
  6. #include<vector>
  7. #include<utility>
  8. #include<map>
  9. using namespace std;
  10. int vis[],num[];//vis反向标记,用num保存一个因子
  11. pair<int,int>p[];
  12. int a[];
  13. int n;
  14. int solve()
  15. {
  16. for(int i=;i<n;i++)
  17. {
  18. if(vis[a[i]]==)
  19. {
  20. vis[a[i]]=;
  21. p[i].first=a[i]/num[a[i]];
  22. p[i].second=num[a[i]];
  23. continue;
  24. }
  25. int flag=;
  26. for(int j=num[a[i]]+;j<=sqrt(a[i]);j++)//对于每个数从最小的因子开始找,找到一对就退出,下一次再次遇到这个数就从num[a[i]]+1开始找因子
  27. {
  28. if(a[i]%j==)
  29. {
  30. flag=;
  31. num[a[i]]=j;//num只存一个因子即可
  32. if(a[i]/j!=j)
  33. vis[a[i]]=;//反向标记,例如第一次找到一组[1,3],用vis标记[3,1]的存在
  34. p[i].first=j;
  35. p[i].second=a[i]/j;
  36. break;//对于每个数,找到一对因子就退出
  37. }
  38. }
  39. if(flag==)
  40. return ;
  41. }
  42.  
  43. return ;
  44. }
  45. int main()
  46. {
  47. scanf("%d",&n);
  48. for(int i=;i<n;i++)
  49. {
  50. scanf("%d",&a[i]);
  51. num[a[i]]=;//初始化a[i]的因子为0
  52. }
  53. if(solve())
  54. {
  55. printf("YES\n");
  56. for(int i=;i<n;i++)
  57. printf("%d %d\n",p[i].first,p[i].second );
  58. }
  59. else
  60. printf("NO\n");
  61. }

E

题意:有n块木板初始有颜色ai...an,刷m次漆,每次刷漆选择一种颜色从当前颜色的最左端刷到当前颜色的最右端,问经过m次刷漆以后最终木板的颜色序列

思路:用set维护各颜色拥有的木板下标,每次涂色直接取set.begin和set.rbegin进行刷漆,此外当一种颜色刷过以后,它所刷过的区间就不再需要遍历,将其左右边界流在set里即可,下次再遍历到这些点直接跳过该区间

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<math.h>
  4. #include<string>
  5. #include<string.h>
  6. #include<vector>
  7. #include<utility>
  8. #include<map>
  9. #include<queue>
  10. #include<set>
  11. #define mx 0x3f3f3f3f
  12. #define ll long long
  13. using namespace std;
  14. int a[],vis[];
  15. set<int>p[];
  16. int main()
  17. {
  18. int n,m,x;
  19. scanf("%d",&n);
  20. for(int i=;i<=n;i++)
  21. {
  22. scanf("%d",&a[i]);
  23. p[a[i]].insert(i);
  24. }
  25. scanf("%d",&m);
  26. for(int i=;i<=m;i++)
  27. {
  28. scanf("%d",&x);
  29. if(p[x].size()<||vis[x])
  30. {
  31. vis[x]=;
  32. continue;
  33. }
  34. int l=*(p[x].begin());//*注意优先级
  35. int r=*(p[x].rbegin());
  36. for(int j=l+;j<=r-;j++)//保留第一个和最后一个位置,中间的位置全部删除
  37. {
  38. p[a[j]].erase(j);
  39. if(vis[a[j]]==&&p[a[j]].size()>=)//遍历过的值直接跳到相应位置开始删除位置
  40. {
  41. j=*(p[a[j]].begin());
  42. p[a[j]].erase(j);
  43. }
  44. }
  45. vis[x]=;
  46. }
  47. for(int i=;i<;i++)
  48. {
  49. if(vis[i]==&&p[i].size()>=)//填充中间位置的数
  50. {
  51. int l=*(p[i].begin());
  52. int r=*(p[i].rbegin());
  53. for(int j=l;j<=r;j++)
  54. a[j]=i;
  55. }
  56. }
  57. for(int i=;i<=n;i++)
  58. {
  59. if(i==)
  60. printf("%d",a[i]);
  61. else
  62. printf(" %d",a[i]);
  63. }
  64. printf("\n");
  65. return ;
  66. }

F. Tickets

题意:有n次询问每次询问给一个数x,且x自动补全六位ABCDEF(可以有前导零),一个数的不幸运值=abs((D+E+F)-(A+B+C)),求出每个在这个数之前比自己不幸运值低的数的个数

题解:提前预处理所有数的不幸运值,然后统计比这个不幸运值低的数的个数

  1. #include<iostream>
  2. #include<string>
  3. #include<string.h>
  4. #include<algorithm>
  5. #include<map>
  6. #define mx 0x3f3f3f3f
  7. #define ll long long
  8. using namespace std;
  9. int a[],cnt[];
  10. ll gcd(ll a, ll b)//最大公约数
  11. {
  12. return b == ? a : gcd(b, a % b);
  13. }
  14. int num(int i)
  15. {
  16. int x=, y=;
  17. int xx=,yy=;
  18. x=i%;
  19. y=i/;
  20. while(x)
  21. {
  22. int temp=x;
  23. x=x/;
  24. xx=xx+temp%;
  25. }
  26. while(y)
  27. {
  28. int temp=y;
  29. y=y/;
  30. yy=yy+temp%;
  31. }
  32. return abs(xx-yy);
  33. }
  34.  
  35. int main()
  36. {
  37. int x;
  38. memset(cnt, , sizeof(cnt));
  39. for(int i=; i<; i++)
  40. {
  41. a[i] = ;
  42. x = num(i);
  43. cnt[x]++;
  44. for(int j=; j<x; j++)
  45. {
  46. a[i]+=cnt[j];
  47. }
  48. }
  49. int n;
  50. scanf("%d", &n);
  51. while(n--)
  52. {
  53. scanf("%d", &x);
  54. printf("%d\n", a[x]);
  55. }
  56. return ;
  57. }

H. Theater Square

题意:有一个矩形,挖掉一个小矩形之后用1*2的方块填充这个矩形,填充不完整的地方(会留有一些1*1)需要将1*2的方块打碎成两块用来填充,问打碎多少块1*2的方块

模拟即可

  1. #include<iostream>
  2. #include<string>
  3. #include<string.h>
  4. #include<algorithm>
  5. #include<map>
  6. #define mx 0x3f3f3f3f
  7. #define ll long long
  8. using namespace std;
  9. int a[],cnt[];
  10. ll gcd(ll a, ll b)//最大公约数
  11. {
  12. return b == ? a : gcd(b, a % b);
  13. }
  14. int num(int i)
  15. {
  16. int x=, y=;
  17. int xx=,yy=;
  18. x=i%;
  19. y=i/;
  20. while(x)
  21. {
  22. int temp=x;
  23. x=x/;
  24. xx=xx+temp%;
  25. }
  26. while(y)
  27. {
  28. int temp=y;
  29. y=y/;
  30. yy=yy+temp%;
  31. }
  32. return abs(xx-yy);
  33. }
  34.  
  35. int main()
  36. {
  37. int x;
  38. memset(cnt, , sizeof(cnt));
  39. for(int i=; i<; i++)
  40. {
  41. a[i] = ;
  42. x = num(i);
  43. cnt[x]++;
  44. for(int j=; j<x; j++)
  45. {
  46. a[i]+=cnt[j];
  47. }
  48. }
  49. int n;
  50. scanf("%d", &n);
  51. while(n--)
  52. {
  53. scanf("%d", &x);
  54. printf("%d\n", a[x]);
  55. }
  56. return ;
  57. }

I

题意:对一组本来连续的数,现在缺失了几个,问你最少缺失了几个

  1. #include<iostream>
  2. #include<string>
  3. #include<string.h>
  4. #include<algorithm>
  5. #define mx 0x3f3f3f3f
  6. #define ll long long
  7. using namespace std;
  8. ll a[];
  9. int main()
  10. {
  11. ll n;
  12. scanf("%lld",&n);
  13. for(int i=;i<n;i++)
  14. scanf("%lld",&a[i]);
  15. sort(a,a+n);
  16. int cnt=;
  17. for(int i=;i<n;i++)
  18. cnt=cnt+a[i]-a[i-]-;
  19. printf("%d\n",cnt);
  20. }

J

题意:多少组w、h的比例满足x/y,要求w<=a&&h<=b

题解:将x/y化成最简分数,答案就是min(a/x,b/y);

  1. #include<iostream>
  2. #include<string>
  3. #include<string.h>
  4. #include<algorithm>
  5. #define mx 0x3f3f3f3f
  6. #define ll long long
  7. using namespace std;
  8.  
  9. ll gcd(ll a, ll b)//最大公约数
  10. {
  11. return b == ? a : gcd(b, a % b);
  12. }
  13. int main()
  14. {
  15. ll a,b,x,y,xx;
  16. scanf("%lld%lld%lld%lld",&a,&b,&x,&y);
  17. xx=gcd(x,y);
  18. x=x/xx;
  19. y=y/xx;
  20. printf("%lld\n",min(a/x,b/y));
  21. }

K

题意:可以将n个数进行区间分割要求每个区间的中位数>=m问最多可以分成多少个区间

题解:先将所有数从小到大排序,找到第一个满足条件的中位数,之后的所有数都满足条件

  1. #include<iostream>
  2. #include<string>
  3. #include<string.h>
  4. #include<algorithm>
  5. #include<map>
  6. #include<queue>
  7. #define mx 0x3f3f3f3f
  8. #define ll long long
  9. using namespace std;
  10. ll gcd(ll a, ll b)//最大公约数
  11. {
  12. return b == ? a : gcd(b, a % b);
  13. }
  14. ll lcm(ll a, ll b)//最小公倍数
  15. {
  16. return a / gcd(a, b) * b;
  17. }
  18. priority_queue<ll,vector<ll>,greater<ll> > p;
  19. int a[];
  20. int main()
  21. {
  22. int n,m;
  23. scanf("%d%d",&n,&m);
  24. for(int i=;i<n;i++)
  25. scanf("%d",&a[i]);
  26. sort(a,a+n);
  27. int len=,now=,cnt=;
  28. for(int i=;i<n;i++)
  29. {
  30. if(a[i]>=m)
  31. break;
  32. len++;
  33. }
  34.  
  35. for(int i=len;i<n;i++)
  36. {
  37. if(a[i]>=m&&len==now)
  38. {
  39. cnt++;
  40. cnt=cnt+n-(i+);
  41. break;
  42. }
  43. else
  44. now++;
  45. }
  46. printf("%d\n",cnt);
  47. return ;
  48. }

gym 101911的更多相关文章

  1. 2019.04.18 第六次训练 【2018-2019 ACM-ICPC, NEERC, Southern Subregional Contest, Qualification Stage】

    题目链接: https://codeforces.com/gym/101911 又补了set的一个知识点,erase(it)之后it这个地址就不存在了,再引用的话就会RE A: ✅ B:  ✅ C: ...

  2. 训练continue

    11.16 树状数组 http://codeforces.com/contest/1070/problem/C digit sum+% dp http://codeforces.com/contest ...

  3. Bacteria(优先队列)

    题目链接:http://codeforces.com/gym/101911/problem/C 问题简述:给定n个细胞以及每个细胞的大小,相同的细胞能进行融合,如果能融合到只剩1个细胞则输出需要额外增 ...

  4. stl(set和map)

    http://codeforces.com/gym/101911/problem/A Recently Monocarp got a job. His working day lasts exactl ...

  5. stl(优先队列操作)

    http://codeforces.com/gym/101911/problem/C Recently Monocarp has created his own mini-laboratory! Th ...

  6. A. Coffee Break(思维题,类似于邻接表的head数组用法)

    题:https://codeforces.com/gym/101911/problem/A 题意:每天工作m分钟,每次喝coffee得间隔d分钟,然后给出n个数,每个数表示想在一天中的a[i]的时刻喝 ...

  7. ACM: Gym 101047M Removing coins in Kem Kadrãn - 暴力

     Gym 101047M Removing coins in Kem Kadrãn Time Limit:2000MS     Memory Limit:65536KB     64bit IO Fo ...

  8. ACM: Gym 101047K Training with Phuket's larvae - 思维题

     Gym 101047K Training with Phuket's larvae Time Limit:2000MS     Memory Limit:65536KB     64bit IO F ...

  9. ACM: Gym 101047E Escape from Ayutthaya - BFS

    Gym 101047E Escape from Ayutthaya Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I6 ...

随机推荐

  1. MQTT的签名算法

    一 使用技小新的算法,时间戳不能带参数否则连接失败: 二 网页的签名算法:http://encode.chahuo.com/ 注意将红色的4个参数换成你自己的clientIddeviceName 密钥 ...

  2. 【PAT甲级】1040 Longest Symmetric String (25 分)(cin.getline(s,1007))

    题意: 输入一个包含空格的字符串,输出它的最长回文子串的长度. AAAAAccepted code: #define HAVE_STRUCT_TIMESPEC #include<bits/std ...

  3. mcast_join_source_group函数

    #include <errno.h> #include <net/if.h> #include <sys/socket.h> #define SA struct s ...

  4. 100w并发产生唯一随机id

    #coding=utf-8 import time import base64 import getopt import sys import threading import random impo ...

  5. Interesting丨当我们用蚂蚁的视角看待世界

    分享一组很有意思的图片~

  6. PAT A1091 Acute Stroke

    对于坐标平面的bfs模板题~ #include<bits/stdc++.h> using namespace std; ; ][][]={false}; ][][]; int n,m,l, ...

  7. golang 中的引号

    前言 go中的单引号',双引号",反引号`,他们用法的区别. 需要先了解字符编码的区别,由来. 单引号 单引号里面只能有一个字符,一般只能用来包裹一个字节的ASCII码字符.他的类型是Gol ...

  8. 吴裕雄--天生自然ORACLE数据库学习笔记:数据表对象

    create table students( stuno ) not null, --学号 stuname ), --姓名 sex ), --性别 age int, --年龄 departno ) n ...

  9. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 排版:引导主体副本

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  10. 企业面试问题收集-ssm框架

    springMVC 1)    简单介绍下你对springMVC的理解? Spring MVC Framework有这样一些特点: 1.它是基于组件技术的.全部的应用对象,无论控制器和视图,还是业务对 ...