A.ElectronicPetEasy

【题意】一个数st1开始,每次加p1,一共加t1次,另外一个数st2开始,每次加p2,一共加t2次,输入的数均小于1000,问这两个数有没有可能相等,有可能输出“Easy”,否则输出“Difficult”

【解释】显然列出两个循环即可,1000*1000也不会超时

const string dif="Difficult";
const string eas="Easy";
class ElectronicPetEasy
{
public:
string isDifficult(int st1, int p1, int t1, int st2, int p2, int t2)
{
int i,j,k;
int m1=st1+p1*(t1-1);
int m2=st2+p2*(t2-1);
for (i=st1;i<=m1;i+=p1)
{
for (j=st2;j<=m2;j+=p2)
{
if (i==j) return dif;
}
}
return eas;
}
};

B.AliceGameEasy

【题意】从1到n,爱丽丝取出几个数累加为x,桐人取出几个数累加为y,给出x和y,问爱丽丝做少取了多少个数(不可能时输出-1)。

【解释】贪心算法

先判断x+y=n*(n+1)/2,能否求出整数n,不能求出来 或者 求出的n不是整数 那么输出-1就好喽

既然求出n了,就让爱丽丝从最大的数开始取,n,n-1,n-2...直到存在k ,使得刚好n+(n-1)+(n-1)+...+(n-k+1)>=x("刚好"的意思是n+(n-1)+(n-1)+...+(n-k)<x),答案就是k。

class AliceGameEasy
{
public:
long long findMinimumValue(long long x, long long y)
{
LL i,j,k;
LL dt=(x+y)*8+1;
LL sqr_dt=(LL)(sqrt(dt));
if (sqr_dt*sqr_dt!=dt) return -1;
sqr_dt--;
if (sqr_dt%2) return -1;
LL n=sqr_dt/2;
LL ans=0;
while (x>0)
{
x-=n;
n--;
ans++;
}
return ans;
}
};

C.BoardFoldingDiv2

【题意】给出一个01矩阵(最多50*50)(就是题目说的纸),现在要折叠这个矩阵,折叠要满足:

1.平行于某条边折叠

2.要沿相邻两列数字之间折叠

3.折叠后下方的数字与上方的数字相等

现在问有多少种折叠方法,(其中折叠后如果是同一块矩阵区间则算同一种方法)

【解释】显然是可以将行与列分开求,求只按行折叠的方法数ansr,和只按列折叠的方法数ansc,最后ansr*ansc就是答案。

由于按行和按列求的方法相同,下面以按列举例。

出题人相当良心,只给了50*50的规模,而且最重要的是只有0和1,那么将每列的01串视为一个二进制数,用long long存完全能存下,我们存到c[]数组中。

大致思路:枚举右界,如果右界可行的话(需要预处理),再枚举左界,如果左界也可行的话,就算是一个解。

这是预处理:设right[i]=1表示从右开始折叠,能折叠到i,即折叠后第i+1~n-1个数(数的编号是0到n-1)全都消失掉了。当然right[i]=0时表示不能折叠到第i个数。

然后枚举左界,right[k]=1时,枚举左界i,用left[i]表示从左开始折叠,能折叠到i(与right[]是相同的思路,只是变了一下方向)。

算法是O(n3)的

typedef long long LL;
int n,m;
LL r[55],c[55];
int ansr,ansc,lef[55],rig[55];
class BoardFoldingDiv2
{
public: int howMany(vector <string> paper)
{
int i,j,k;
memset(r,0,sizeof(r));
memset(c,0,sizeof(c));
ansr=ansc=0;
n=paper.size();
m=paper[0].size(); for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
r[i]=r[i]*2+paper[i][j]-'0';
c[j]=c[j]*2+paper[i][j]-'0';
}
}
/*对每一横行操作*/
memset(rig,0,sizeof(rig));
rig[n-1]=1;
for (i=n-2;i>=0;i--)
{
for (j=1;i+j<n&&i-j+1>=0;j++)
{
if (r[i+j]==r[i-j+1])
{
if (rig[i+j])
{
rig[i]=1;
break;
}
}
else break;
}
}
for (k=n-1;k>=0;k--)//枚举右界
{
if (rig[k]==0) continue;//如果右界不可达,continue
memset(lef,0,sizeof(lef));
lef[0]=1; ansr++;
for (i=1;i<=k;i++)//枚举左界
{
for (j=1;i+j-1<=k&&i-j>=0;j++)//判断左界是否可达
{
if (r[i+j-1]==r[i-j])
{
if (lef[i-j])//如果left[i-j]可达 并且 正好能沿数i与数i-1间折叠
{
lef[i]=1;//设为可达后跳出
break;
}
}
else break;
}
if (lef[i]!=0) ansr++;
}
} /*对每一列操作*/
memset(rig,0,sizeof(rig));
rig[m-1]=1;
for (i=m-2;i>=0;i--)
{
for (j=1;i+j<m&&i-j+1>=0;j++)
{
if (c[i+j]==c[i-j+1])
{
if (rig[i+j])
{
rig[i]=1;
break;
}
}
else break;
}
} for (k=m-1;k>=0;k--)
{
if (rig[k]==0) continue;
memset(lef,0,sizeof(lef));
lef[0]=1; ansc+=min(1,lef[0]*rig[k]);
for (i=1;i<=k;i++)
{
for (j=1;i+j-1<=k&&i-j>=0;j++)
{
if (c[i+j-1]==c[i-j])
{
if (lef[i-j])
{
lef[i]=1;
break;
}
}
else break;
}
if (lef[i]!=0) ansc++;
}
}
return ansr*ansc;
}
};

Topcoder SRM 639 (Div.2)的更多相关文章

  1. TopCoder SRM 639 Div.2 500 AliceGameEasy

    题意: 一个游戏有n轮,有A和B比赛,谁在第 i 轮得胜,就获得 i 分,给出x,y,问A得x分,B得y分有没有可能,如果有,输出A最少赢的盘数 解题思路: 首先判断n(n+1)/2 = (x+y)是 ...

  2. TopCoder SRM 639 Div.2 500 AliceGameEasy --乱搞

    题意: 一个游戏有n轮,有A和B比赛,谁在第 i 轮得胜,就获得 i 分,给出x,y,问A得x分,B得y分有没有可能,如果有,输出A最少赢的盘数. 解法: 这题是我傻逼了,处理上各种不优越,要使n*( ...

  3. TopCoder SRM 560 Div 1 - Problem 1000 BoundedOptimization & Codeforces 839 E

    传送门:https://284914869.github.io/AEoj/560.html 题目简述: 定义"项"为两个不同变量相乘. 求一个由多个不同"项"相 ...

  4. TopCoder SRM 667 Div.2题解

    概览: T1 枚举 T2 状压DP T3 DP TopCoder SRM 667 Div.2 T1 解题思路 由于数据范围很小,所以直接枚举所有点,判断是否可行.时间复杂度O(δX × δY),空间复 ...

  5. [topcoder]SRM 646 DIV 2

    第一题:K等于1或者2,非常简单.略.K更多的情况,http://www.cnblogs.com/lautsie/p/4242975.html,值得思考. 第二题:http://www.cnblogs ...

  6. [topcoder]SRM 633 DIV 2

    第一题,http://community.topcoder.com/stat?c=problem_statement&pm=13462&rd=16076 模拟就可以了. #includ ...

  7. TopCoder SRM 596 DIV 1 250

    body { font-family: Monospaced; font-size: 12pt } pre { font-family: Monospaced; font-size: 12pt } P ...

  8. Topcoder SRM 656 (Div.1) 250 RandomPancakeStack - 概率+记忆化搜索

    最近连续三次TC爆零了,,,我的心好痛. 不知怎么想的,这题把题意理解成,第一次选择j,第二次选择i后,只能从1~i-1.i+1~j找,其实还可以从j+1~n中找,只要没有被选中过就行... [题意] ...

  9. Topcoder SRM 648 (div.2)

    第一次做TC全部通过,截图纪念一下. 终于蓝了一次,也是TC上第一次变成蓝名,下次就要做Div.1了,希望div1不要挂零..._(:зゝ∠)_ A. KitayutaMart2 万年不变的水题. # ...

随机推荐

  1. 如何使一个你没有源代码的DLL文件变为强命名的DLL

    转载: 有时候你会需要一个DLL是强命名的,比如你想把这个文件放到GAC里面.如果这是一个第三方的DLL,你没有源代码,这会是一件比较麻烦的事情.有一个方法可以解决这个问题. 在VS.NET的命名行窗 ...

  2. IOS快速开发之常量定义

    ---恢复内容开始--- 在IOS开发中,有一些方法常常需要用的,但是有很长的方法名,这造成了代码长,写起来累,我们可以通过宏定义了解决这些问题 比如说在代码布局的时候会遇上这样的问题,我们要获取上面 ...

  3. 2015 偶数求和 AC 杭电

    偶数求和 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  4. CentOS 6.4 64位 源码编译hadoop 2.2.0

    搭建环境:Centos 6.4 64bit 1.安装JDK 参考这里2.安装mavenmaven官方下载地址,可以选择源码编码安装,这里就直接下载编译好的wget http://mirror.bit. ...

  5. UGUI穿透3D世界判断&&UGUI全事件监听

    public bool isPointUI(){ PointerEventData eventDataCurrnt = new PointerEventData (EventSystem.curren ...

  6. 前端工程之模块化(来自百度FEX)

    模块化 是一种处理复杂系统分解成为更好的可管理模块的方式,它可以把系统代码划分为一系列职责单一,高度解耦且可替换的模块,系统中某一部分的变化将如何影响其它部分就会变得显而易见,系统的可维护性更加简单易 ...

  7. 【HDOJ】4982 Goffi and Squary Partition

    题意就是整数划分,选出和为n的K个整数,其中K-1个数的和为完全平方数S.选择整数时需要从1,2,3..连续选择,当选择整数与n-S相等时,需要跳过n-S,即选择n-S+1.如此选择K-2个数,从而可 ...

  8. 【HDOJ】3400 Line belt

    三分. #include <cstdio> #include <cstring> #include <cmath> typedef struct { double ...

  9. Java---常用基础面试知识点

    综合网上的一点资源,给大家整理了一些Java常用的基础面试知识点,希望能帮助到刚开始学习或正在学习的学员. 1.抽象 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方 ...

  10. 在Visual Studio中使用AStyle

    最近在做一个C++项目,我们使用了一个叫做AStyle的插件来做代码格式化. 下载方式1:通过Visual Studio下载 启动Visual Studio,以下简称VS: 英文版VS:VS主菜单 & ...