Topcoder SRM 608 div1 题解
Easy(300pts):
题目大意:有n个盒子,一共有S个苹果,每个盒子有多少个苹果不知道,但是知道每个盒子的苹果下限和上限。现在要至少选择X个苹果,问如果要保证无论如何都能获得至少X个苹果,至少需要选择多少个盒子。数据满足n<=50。
首先第一个方面,如果我们选择的盒子的下限大于等于X,那么显然我们一定可以获得那么多的苹果,
所以我们将盒子的下限排序,然后从大到小累加即可。
另一方面,如果我们没有选择的盒子的上限小于等于S-X,那么显然我们也一定可以获得那么多的苹果,
于是我们再按照上限排序,然后扫一遍累加即可。
时间复杂度O(nlogn),代码如下:
#include <bits/stdc++.h>
#define Maxn 57
using namespace std;
int n;
int l[Maxn],r[Maxn];
class MysticAndCandies
{
public:
int minBoxes(int C, int X, vector <int> low, vector <int> high)
{
n=low.size();
for (int i=;i<=n;i++) l[i]=low[i-];
for (int i=;i<=n;i++) r[i]=high[i-];
sort(l+,l+n+);
sort(r+,r+n+);
for (int i=;i<n+-i;i++) swap(l[i],l[n+-i]),swap(r[i],r[n+-i]);
int ans,sum1=,sum2=;
for (int i=;i<=n;i++) sum2+=r[i];
for (ans=;ans<=n;ans++)
{
sum1+=l[ans];
sum2-=r[ans];
if (sum1>=X||C-sum2>=X) break;
}
return ans;
}
};
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),代码如下:
#include <bits/stdc++.h>
#define Maxn 57
using namespace std;
bool vis[Maxn][Maxn];
int fa[Maxn],sum[Maxn],sumedge[Maxn];
int r[Maxn],f[Maxn];
int n;
class BigO
{
public:
int minK(vector <string> graph)
{
n=graph.size();
for (int i=;i<n;i++)
for (int j=;j<n;j++)
if (graph[i][j]=='Y') vis[i][j]=true; else vis[i][j]=false;
for (int i=;i<n;i++)
vis[i][i]=true;
for (int k=;k<n;k++)
for (int i=;i<n;i++)
for (int j=;j<n;j++)
if (vis[i][k]&&vis[k][j]) vis[i][j]=true;
memset(sum,,sizeof(sum));
for (int i=;i<n;i++)
for (int j=;j<n;j++)
if (vis[i][j]&&vis[j][i])
{
fa[i]=j;
++sum[j];
break;
}
memset(sumedge,,sizeof(sumedge));
for (int i=;i<n;i++)
for (int j=;j<n;j++)
if (graph[i][j]=='Y'&&fa[i]==fa[j]&&i!=j)
++sumedge[fa[i]];
memset(r,,sizeof(r));
memset(f,,sizeof(f));
for (int i=;i<n;i++)
{
//the SCC is more than a circle
if (sumedge[i]>sum[i]) return -;
//the SCC is more than a point
if (sumedge[i]!=) r[i]=;
f[i]=r[i];
}
for (int T=;T<n;T++)
for (int i=;i<n;i++)
for (int j=;j<n;j++)
if (fa[i]!=fa[j]&&graph[i][j]=='Y')
f[fa[j]]=max(f[fa[j]],f[fa[i]]+r[fa[j]]);
int res=;
for (int i=;i<n;i++)
res=max(f[i]-,res);
return res;
}
};
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),代码如下:
#include <bits/stdc++.h>
#define Maxa 5007
using namespace std;
int ans[Maxa][Maxa];
string s;
long long res=;
class OneDimensionalRobot
{
public:
long long theSum(vector <string> commands1, vector <string> commands2, int minA, int maxA, int minB, int maxB)
{
s.clear();
for (int i=;i<commands1.size();i++) s+=commands1[i];
for (int i=;i<commands2.size();i++) s+=commands2[i];
int left=,right=,pos=;
for (int i=;i<s.length();i++)
{
if (s[i]=='R') ++pos; else --pos;
if (-pos>left) left=-pos;
if (pos>right) right=pos;
}
memset(ans,,sizeof(ans));
for (int i=minA;i<=maxA;i++)
for (int j=minB;j<=maxB;j++)
{
if (i>=left&&j>=right) ans[i][j]=pos; else
if (i==minA||j==maxB)
{
int now=;
for (int k=;k<s.length();k++)
{
if (s[k]=='R') ++now; else --now;
if (-now>i) now=-i;
if (now>j) now=j;
}
ans[i][j]=now;
} else
{
ans[i][j]=ans[i-][j+];
if (left>i-||right>j) --ans[i][j];
}
}
for (int i=minA;i<=maxA;i++)
for (int j=minB;j<=maxB;j++)
res+=ans[i][j];
return res;
}
};
Topcoder SRM 608 div1 题解的更多相关文章
- Topcoder SRM 602 div1题解
打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...
- Topcoder SRM 607 div1题解
好久没来写了,继续继续... Easy(250pts): //前方请注意,样例中带有zyz,高能预警... 题目大意:给你一个字符串,中间有一些是未知字符,请你求出这个字符串的回文子串个数的期望值.数 ...
- Topcoder SRM 606 div1题解
打卡! Easy(250pts): 题目大意:一个人心中想了一个数,另一个人进行了n次猜测,每一次第一个人都会告诉他实际的数和猜测的数的差的绝对值是多少,现在告诉你所有的猜测和所有的差,要求你判断心中 ...
- Topcoder SRM 605 div1 题解
日常打卡- Easy(250pts): 题目大意:你有n种汉堡包(统统吃掉-),每一种汉堡包有一个type值和一个taste值,你现在要吃掉若干个汉堡包,使得它们taste的总和*(不同的type值的 ...
- Topcoder SRM 604 div1题解
CTSC考完跑了过来日常TC--- Easy(250pts): 题目大意:有个机器人,一开始的位置在(0,0),第k个回合可以向四个方向移动3^k的距离(不能不动),问是否可以到达(x,y),数据满足 ...
- Topcoder SRM 603 div1题解
昨天刚打了一场codeforces...困死了...不过赶在睡前终于做完了- 话说这好像是我第一次做250-500-1000的标配耶--- Easy(250pts): 题目大意:有一棵树,一共n个节点 ...
- Topcoder SRM 601 div1题解
日常TC计划- Easy(250pts): 题目大意:有n个篮子,每个篮子有若干个苹果和橘子,先任取一个正整数x,然后从每个篮子中选出x个水果,把nx个水果放在一起,输出一共有多少种不同的组成方案.其 ...
- Topcoder SRM 600 div1题解
日常TC计划正式启动! Easy(250pts): 题目大意:给你一个集合,里面一堆数,初始数为0,给你一个目标数,你可以选择集合中若干个数进行OR操作来得到目标数.问至少删去多少个数,使得你永远无法 ...
- Topcoder SRM 643 Div1 250<peter_pan>
Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...
随机推荐
- 【转】odoo11新功能及绿色版汇总
昆山-Jeffery 11:34:00 ,odoo11 新功能: 评论:看到截图,感觉美工上又有所提高 官方的发布说明:https://www.odoo.com/nl_NL/page/odoo-11- ...
- 1394-Minimum Inversion Number
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- 关于实现mybatis order by 排序传递参数实现 问题记录
一 问题场景:本人项目纯纯的后端系统 并且项目前端采用纯纯的原生js 实现 1)表格 通过查询列表数据放入到域中 前段采用 for循环的方式实现遍历生成列表 2)分页实现本人是公司内部自定 ...
- 3,SQL语句及数据库优化
1,统一SQL语句的写法 对于以下两句SQL语句,程序员认为是相同的,数据库查询优化器认为是不同的. 所以封装成复用方法,用标准模板来控制. select*from dual select*Fr ...
- ASP.NET MVC 使用jquery.form.js 异步上传 在IE下返回值被变为下载的解决办法
错误记录: <script type="text/javascript"> $(function () { $(document).off("ajaxSend ...
- fiddler之弱网测试
今天就说一下如何使用fiddler做弱网测试 1.首先要把手机的代理打开,这就不多讲了哈,不懂得话请点传送门:https://www.cnblogs.com/fuxinxin/p/9146693.ht ...
- Java并发基础--线程安全
一.线程安全 1.线程安全的概念 线程安全:某个类被单个线程,或者多个线程同时访问,所表现出来的行为是一致,则可以说这个类是线程安全的. 2.什么情况下会出现线程安全问题 在单线程中不会出现线程安全问 ...
- (原创)不过如此的 DFS 深度优先遍历
DFS 深度优先遍历 DFS算法用于遍历图结构,旨在遍历每一个结点,顾名思义,这种方法把遍历的重点放在深度上,什么意思呢?就是在访问过的结点做标记的前提下,一条路走到天黑,我们都知道当每一个结点都有很 ...
- LeetCode 82 ——删除排序链表中的重复元素 II
1. 题目 2. 解答 新建一个链表,并添加一个哨兵结点,从前向后开始遍历链表. 如果下一个结点的值和当前结点的值相等,则循环向后遍历直到找到一个和当前结点值不相等的结点: 反之,如果下一个结点的值和 ...
- C# Lambda表达式使用累加器例子
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Lamb ...