Easy(300pts):

题目大意:有n个盒子,一共有S个苹果,每个盒子有多少个苹果不知道,但是知道每个盒子的苹果下限和上限。现在要至少选择X个苹果,问如果要保证无论如何都能获得至少X个苹果,至少需要选择多少个盒子。数据满足n<=50。

首先第一个方面,如果我们选择的盒子的下限大于等于X,那么显然我们一定可以获得那么多的苹果,

所以我们将盒子的下限排序,然后从大到小累加即可。

另一方面,如果我们没有选择的盒子的上限小于等于S-X,那么显然我们也一定可以获得那么多的苹果,

于是我们再按照上限排序,然后扫一遍累加即可。

时间复杂度O(nlogn),代码如下:

  1. #include <bits/stdc++.h>
  2. #define Maxn 57
  3. using namespace std;
  4. int n;
  5. int l[Maxn],r[Maxn];
  6. class MysticAndCandies
  7. {
  8. public:
  9. int minBoxes(int C, int X, vector <int> low, vector <int> high)
  10. {
  11. n=low.size();
  12. for (int i=;i<=n;i++) l[i]=low[i-];
  13. for (int i=;i<=n;i++) r[i]=high[i-];
  14. sort(l+,l+n+);
  15. sort(r+,r+n+);
  16. for (int i=;i<n+-i;i++) swap(l[i],l[n+-i]),swap(r[i],r[n+-i]);
  17. int ans,sum1=,sum2=;
  18. for (int i=;i<=n;i++) sum2+=r[i];
  19. for (ans=;ans<=n;ans++)
  20. {
  21. sum1+=l[ans];
  22. sum2-=r[ans];
  23. if (sum1>=X||C-sum2>=X) break;
  24. }
  25. return ans;
  26. }
  27. };

Medium(600pts):

题目大意:给出一个n个点的有向图,假设长度为L的路径一共有S条(路径可以经过重复的点多次,S也可以是无穷大),问当L非常大的时候,S的量级是L的几次方。当然,有可能S不能用L的几次方表示,那么输出-1。数据满足n<=50。

通过题面来看,就感觉这题很厉害。。。

我们先从一个环来考虑,一个环的长度为L的路径显然只有有数条,那么这个时候S就是L的一次方量级。

然后我们来考虑一个强联通分量,如果这个强联通分量不仅仅只是一个环,那么路径条数就是指数级别的了。

回到原题,我们把原图中的强联通分量全部求出来,

至少图变成了一个DAG,然后发现所有的SCC必须是环,

然后差不多dp之类的都可以做了。

由于这道题n<=50,所以根本不需要什么Tarjan,直接floyed就行了。

时间复杂度O(n^3),代码如下:

  1. #include <bits/stdc++.h>
  2. #define Maxn 57
  3. using namespace std;
  4. bool vis[Maxn][Maxn];
  5. int fa[Maxn],sum[Maxn],sumedge[Maxn];
  6. int r[Maxn],f[Maxn];
  7. int n;
  8. class BigO
  9. {
  10. public:
  11. int minK(vector <string> graph)
  12. {
  13. n=graph.size();
  14. for (int i=;i<n;i++)
  15. for (int j=;j<n;j++)
  16. if (graph[i][j]=='Y') vis[i][j]=true; else vis[i][j]=false;
  17. for (int i=;i<n;i++)
  18. vis[i][i]=true;
  19. for (int k=;k<n;k++)
  20. for (int i=;i<n;i++)
  21. for (int j=;j<n;j++)
  22. if (vis[i][k]&&vis[k][j]) vis[i][j]=true;
  23. memset(sum,,sizeof(sum));
  24. for (int i=;i<n;i++)
  25. for (int j=;j<n;j++)
  26. if (vis[i][j]&&vis[j][i])
  27. {
  28. fa[i]=j;
  29. ++sum[j];
  30. break;
  31. }
  32. memset(sumedge,,sizeof(sumedge));
  33. for (int i=;i<n;i++)
  34. for (int j=;j<n;j++)
  35. if (graph[i][j]=='Y'&&fa[i]==fa[j]&&i!=j)
  36. ++sumedge[fa[i]];
  37. memset(r,,sizeof(r));
  38. memset(f,,sizeof(f));
  39. for (int i=;i<n;i++)
  40. {
  41. //the SCC is more than a circle
  42. if (sumedge[i]>sum[i]) return -;
  43. //the SCC is more than a point
  44. if (sumedge[i]!=) r[i]=;
  45. f[i]=r[i];
  46. }
  47. for (int T=;T<n;T++)
  48. for (int i=;i<n;i++)
  49. for (int j=;j<n;j++)
  50. if (fa[i]!=fa[j]&&graph[i][j]=='Y')
  51. f[fa[j]]=max(f[fa[j]],f[fa[i]]+r[fa[j]]);
  52. int res=;
  53. for (int i=;i<n;i++)
  54. res=max(f[i]-,res);
  55. return res;
  56. }
  57. };

Hard(900pts):

题目大意:有一个机器人在x轴上,初始位置为0,它接受到了一系列指令,每次向左一个单位或者向右一个单位。如果现在在左边界上,那么就不能再往左了,向左的指令会被忽略;如果现在在右边界上,那么就不能再往右了,向右的指令会被忽略。现在对于minA<=A<=maxA,minB<=B<=maxB,求出以A为左边界,B为右边界的最终位置的总和,数据满足所有数<=5000。

这题是个神结论题,不打算多说。。。

我们假设边界都是无穷大的时候,求出出现过的最左侧位置和最右侧位置。

如果A和B分别大于等于两边边界,那么答案就是最终位置。

如果不是的话,有一个结论就是(a,b)等于(a-1,b+1)-1,然后按照差暴力就可以了。

时间复杂度O(nX+X^2),代码如下:

  1. #include <bits/stdc++.h>
  2. #define Maxa 5007
  3. using namespace std;
  4. int ans[Maxa][Maxa];
  5. string s;
  6. long long res=;
  7. class OneDimensionalRobot
  8. {
  9. public:
  10. long long theSum(vector <string> commands1, vector <string> commands2, int minA, int maxA, int minB, int maxB)
  11. {
  12. s.clear();
  13. for (int i=;i<commands1.size();i++) s+=commands1[i];
  14. for (int i=;i<commands2.size();i++) s+=commands2[i];
  15. int left=,right=,pos=;
  16. for (int i=;i<s.length();i++)
  17. {
  18. if (s[i]=='R') ++pos; else --pos;
  19. if (-pos>left) left=-pos;
  20. if (pos>right) right=pos;
  21. }
  22. memset(ans,,sizeof(ans));
  23. for (int i=minA;i<=maxA;i++)
  24. for (int j=minB;j<=maxB;j++)
  25. {
  26. if (i>=left&&j>=right) ans[i][j]=pos; else
  27. if (i==minA||j==maxB)
  28. {
  29. int now=;
  30. for (int k=;k<s.length();k++)
  31. {
  32. if (s[k]=='R') ++now; else --now;
  33. if (-now>i) now=-i;
  34. if (now>j) now=j;
  35. }
  36. ans[i][j]=now;
  37. } else
  38. {
  39. ans[i][j]=ans[i-][j+];
  40. if (left>i-||right>j) --ans[i][j];
  41. }
  42. }
  43. for (int i=minA;i<=maxA;i++)
  44. for (int j=minB;j<=maxB;j++)
  45. res+=ans[i][j];
  46. return res;
  47. }
  48. };

Topcoder SRM 608 div1 题解的更多相关文章

  1. Topcoder SRM 602 div1题解

    打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...

  2. Topcoder SRM 607 div1题解

    好久没来写了,继续继续... Easy(250pts): //前方请注意,样例中带有zyz,高能预警... 题目大意:给你一个字符串,中间有一些是未知字符,请你求出这个字符串的回文子串个数的期望值.数 ...

  3. Topcoder SRM 606 div1题解

    打卡! Easy(250pts): 题目大意:一个人心中想了一个数,另一个人进行了n次猜测,每一次第一个人都会告诉他实际的数和猜测的数的差的绝对值是多少,现在告诉你所有的猜测和所有的差,要求你判断心中 ...

  4. Topcoder SRM 605 div1 题解

    日常打卡- Easy(250pts): 题目大意:你有n种汉堡包(统统吃掉-),每一种汉堡包有一个type值和一个taste值,你现在要吃掉若干个汉堡包,使得它们taste的总和*(不同的type值的 ...

  5. Topcoder SRM 604 div1题解

    CTSC考完跑了过来日常TC--- Easy(250pts): 题目大意:有个机器人,一开始的位置在(0,0),第k个回合可以向四个方向移动3^k的距离(不能不动),问是否可以到达(x,y),数据满足 ...

  6. Topcoder SRM 603 div1题解

    昨天刚打了一场codeforces...困死了...不过赶在睡前终于做完了- 话说这好像是我第一次做250-500-1000的标配耶--- Easy(250pts): 题目大意:有一棵树,一共n个节点 ...

  7. Topcoder SRM 601 div1题解

    日常TC计划- Easy(250pts): 题目大意:有n个篮子,每个篮子有若干个苹果和橘子,先任取一个正整数x,然后从每个篮子中选出x个水果,把nx个水果放在一起,输出一共有多少种不同的组成方案.其 ...

  8. Topcoder SRM 600 div1题解

    日常TC计划正式启动! Easy(250pts): 题目大意:给你一个集合,里面一堆数,初始数为0,给你一个目标数,你可以选择集合中若干个数进行OR操作来得到目标数.问至少删去多少个数,使得你永远无法 ...

  9. Topcoder SRM 643 Div1 250<peter_pan>

    Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...

随机推荐

  1. 将List中的数据更新到数据库中

    List中有相应的数据,更新到数据库如下: 1.根据关键字查找后删除: foreach (var item in objSelList) { ADDaAn da = db.ADDaAns.Find(i ...

  2. 在spring+beranate中多数据源中使用 ThreadLocal ,总结的原理 --费元星

    设计模式 首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问 ...

  3. php之apc浅探

    扩展编译: ./configure --enable-apc --with-php-config=/usr/local/php/bin/php-config --prefix=/usr/local/a ...

  4. 「日常训练」Soldier and Badges (CFR304D2B)

    题意 (Codeforces 546B) 问对一个序列最少需要增减几个1能使其彼此不同. 分析 模拟处理.需要注意的是,尽管题目中说了an<=3000,问题是,如果一群a全是3000呢(滑稽), ...

  5. 利用selenium自动化登录淘宝

    #encoding=utf-8 from selenium import webdriver from selenium.webdriver.common.action_chains import A ...

  6. 孤荷凌寒自学python第六十九天学习并实践beautifulsoup对象用法2

    孤荷凌寒自学python第六十九天学习并实践beautifulsoup对象用法2 (完整学习过程屏幕记录视频地址在文末) 今天继续学习beautifulsoup对象的属性与方法等内容. 一.今天进一步 ...

  7. 学习人工智能的第五个月[字典学习[Dictionary Learning,DL]]

    摘要: 大白话解释字典学习,分享第五个月的学习过程,人生感悟,最后是自问自答. 目录: 1.字典学习(Dictionary Learning,DL) 2.学习过程 3.自问自答 内容: 1.字典学习( ...

  8. python——pyinstaller生成exe基本使用和遇到的坑

    1.安装 pip install pyinstaller 2.常规操作 在cmd界面(之前安装python或者anaconda的时候正确添加环境变量的话,是可以在cmd界面直接执行pyinstalle ...

  9. linux学习(二)——汤哥的推荐书籍

    成为一名精通 Linux程序设计的高级程序员一直是不少朋友孜孜以求的目标. 根据中华英才网统计数据,北京地区 Linux 程序员月薪平均为 Windows程序员的 1.8 倍.Java 程序员的 2. ...

  10. 平面最近点对(HDU 1007)

    题解:点击 #include <stdio.h> #include <string.h> #include <algorithm> #include <ios ...