TopCoder SRM 625 Incrementing Sequence 题解
本题就是给出一个数k和一个数组,包含N个元素,通过每次添加�数组中的一个数的操作,最后须要得到1 - N的一个序列,不用排序。
能够从暴力法入手,然后优化。
这里利用hash表进行优化,终于得到时间效率是O(n*n)的算法,并且常数项应该非常低,速度还挺快的。
思路:
1 假设数组A[i]在1 -N 范围内,就利用bool B[]记录,这个数已经找到了;
2 假设A[i]的值之前已经找到了,那么就添加�k操作,得到新的值A[i]+k,看这个值是否找到了,假设没找到,就使用B记录,假设之前已经找到了,那么就继续反复添加�k的操作。
3 假设最后A[i]+k大于N了,那么就能够返回IMPOSIBLE了,由于这样不可能得到要求的数列了。
本算法的缺点是须要额外O(n)的bool空间,只是一般算法会通过sort之后处理也须要O(lgn)的int空间了,所以空间效率事实上也差点儿相同。
而本算法的长处是:不须要排序,不须要做模运算,常数项应该低点,执行速度快。
#include <vector>
#include <string>
using namespace std; class IncrementingSequence
{
public:
string canItBeDone(int k, vector<int> &A)
{
int N = (int)A.size();
vector<bool> B(N+1);
for (int i = 0; i < N; i++)
{
if (A[i] > N) return "IMPOSSIBLE";
while (A[i] <= 0 || B[A[i]])
{
A[i] += k;
if (A[i] > N) return "IMPOSSIBLE";
}
B[A[i]] = true;//不要错写成B[i]
}
for (int i = 1; i <= N; i++) //别漏这个循环推断
{
if (!B[i]) return "IMPOSSIBLE";
}
return "POSSIBLE";
}
};
附一道250分的水题,须要找a*b +c = y,给出y找到a,b,c当中a, b, c 不能等于0, 或者1
#include <vector>
#include <math.h>
using namespace std; class AddMultiply
{
public:
vector<int> makeExpression(int y)
{
vector<int> vx(3);
vx[0] = -1; vx[1] = 2;
vx[2] = y - vx[0] * vx[1];
return vx;
}
};
当然,假设还有额外的限制,那么本算法不是完好的,只是这里不错的思路是先找好难的部分,乘法部分,然后找加数就easy了。
TopCoder SRM 625 Incrementing Sequence 题解的更多相关文章
- TopCoder SRM 667 Div.2题解
概览: T1 枚举 T2 状压DP T3 DP TopCoder SRM 667 Div.2 T1 解题思路 由于数据范围很小,所以直接枚举所有点,判断是否可行.时间复杂度O(δX × δY),空间复 ...
- topcoder SRM 625 DIV2 IncrementingSequence
由于题目数据量比较小,故可以开辟一个数组存储每个index出现的次数 然后遍历即可 string canItBeDone(int k, vector<int> A){ vector< ...
- topcoder SRM 625 DIV2 AddMultiply
由于题目告诉肯定至少存在一种解, 故只需要根据条件遍历一下, vector <int> makeExpression(int y) { vector<int> res; ; i ...
- topcoder srm 625 div1
problem1 link 假设第$i$种出现的次数为$n_{i}$,总个数为$m$,那么排列数为$T=\frac{m!}{\prod_{i=1}^{26}(n_{i}!)}$ 然后计算回文的个数,只 ...
- Topcoder SRM 674 Div.2题解
T1 解题思路 这题应该不是很难,主要是题意理解问题. 注意给出的两个数组里映射关系已经对应好了,只要判断是否为双射即可 参考程序 #include <bits/stdc++.h> usi ...
- TopCoder SRM 560 Div 1 - Problem 1000 BoundedOptimization & Codeforces 839 E
传送门:https://284914869.github.io/AEoj/560.html 题目简述: 定义"项"为两个不同变量相乘. 求一个由多个不同"项"相 ...
- 【CF486E】LIS of Sequence题解
[CF486E]LIS of Sequence题解 题目链接 题意: 给你一个长度为n的序列a1,a2,...,an,你需要把这n个元素分成三类:1,2,3: 1:所有的最长上升子序列都不包含这个元素 ...
- Topcoder SRM 643 Div1 250<peter_pan>
Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...
- Topcoder Srm 726 Div1 Hard
Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...
随机推荐
- C++断言assert
assert宏是在标准库中提供的.它在库文件<cassert>中声明,它能够在程序中測试逻辑表达式,假设指定的逻辑表达式是false,assert()就会终止程序,并显示诊断消息.关闭断言 ...
- 禁止页面复制功能 js禁止复制 禁用页面右键菜单
<body oncontextmenu="return false">禁用网页右键菜单,但是仍然可以使用快捷键复制. js代码禁用复制功能: <script t ...
- SQL注入(一)普通型注入
既然说了从头开始,先从注入开始吧,先来温习一下之前会的一些注入. PHP注入 0x01: 判断是否存在注入: ' 报错 ' and 1=1 正确 ' and 1=2 错误 0x01: or ...
- eclipse插件maven的使用,web打包成WAR,tomcat下直接运行
1.首先下载maven 其下载地址为:http://maven.apache.org/download.html 下载apache-maven-3.0.3-bin.zip 环境变量配置为 变量 ...
- 基于visual Studio2013解决面试题之0503取最大数字字符串
题目
- 性能测试之LoardRunner 手动关联二
概述: 1.如果寻找左右边界值 2.关联函数详解 以下是详细介绍 1.如果寻找左右边界值 <以login 为例> Step1.录制两份相同的业务流程的的脚本,输入的数据要相同 Step2. ...
- Codility上的问题 (17) PI 2012
这个题比较简单,给定一个整数数组,对每个元素,求出和它最近比它大的数的距离(下标绝对值),如果没有比它大的数,认为距离是0. 数组元素个数 N [0..50000],数组元素范围[-10^9, +10 ...
- HDU1027 Ignatius and the Princess II 【next_permutation】【DFS】
Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ( ...
- [ACM] 九度OJ 1553 时钟
时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:1733 解决:656 题目描写叙述: 如图,给定随意时刻,求时针和分针的夹角(劣弧所相应的角). 输入: 输入包括多组測试数据.每组測试数 ...
- 杭电 1711 Number Sequence
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...