第一题 大天使之剑 大意:

  有n个怪,每个怪的ph 为 h[i],有三种攻击方式,普通攻击:一次打一个怪一滴血;重击(消耗1魔法值):一次打一个怪两滴血;群体攻击(消耗1魔法值):一次打所有怪一滴血。你有无数血,m个魔法值,每攻击一次怪后,还存活的所有怪会各攻击你一滴血。问你打完所有怪你最少被打了多少滴血。

解:

  看到这道题,首先想到的是搜索,一种一种的搜,把所有情况都搜出来找最小。在草稿纸上再列一些数据就会发现,其实是个贪心。在有魔法值的时候,尽量全用于群体攻击更划算,然后没有了就普通攻击。那重击呢?由于我的数据比较特殊,所以我判重击的条件是还剩两个偶数滴血的怪,但其实,不管它的血量是偶数还是奇数,重击都更划算。还有一些杂七杂八的减没减过sum的问题等,让我调试了一个下午。看来以后静态查错很重要,少犯小错误。代码写得丑。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 100005
#define ll long long
using namespace std;
ll n,m,ph[maxn],ans,sum,cur=;
bool jian[maxn];
void print()
{
printf("%I64d",ans);
return ;
}
int main()
{
freopen("zhijian.in","r",stdin);
freopen("zhijian.out","w",stdout);
cin>>n>>m;
for (int i=;i<=n;i++)
scanf("%d",&ph[i]);
sort(ph+,ph++n);
while (m)
{
if (n-cur+<=){//改用重击
for (int i=cur;i<=n;i++)
if (!jian[i]) ph[i]-=sum;
while(m){
if (cur>n) {
print();return ;
}
if (ph[cur]<=){
ans+=n-cur;
cur++;continue;
}
ph[cur]-=;
ans+=n-cur+;
m--;
}
while (cur<=n){
if (ph[cur]){
int ci=ph[cur]-;
ans+=(n-cur+)*ci;
}
ans+=n-cur;
cur++;
}
print();
return ;
}
sum++;
ph[cur]--;int h=cur;
jian[cur]=true;
ans+=n-cur+;
while (ph[cur]<=){
ans--;
cur++;
ph[cur]-=sum;
jian[cur]=true;//判断
}
m--;
}
while (cur<=n){
if (!jian[cur]) ph[cur]-=sum;//直接减会多减
if (ph[cur]){
int ci=ph[cur]-;
ans+=(n-cur+)*ci;
}
ans+=n-cur;
cur++;
}
printf("%I64d",ans);
return ;
}

第二题 保卫萝卜 大意:

  一个很大的矩阵,起点在正中心的方格。数据有向上下左右四个方向走的记录,输出走过的方格及所围的方格数。

解:

  有两种大体思路。一个是直接正着算面积,还有反着算走不到的点。我用的后者。但有一个问题,就是存矩阵。我把它走过的地方的最左边上面下面和右边记录下来,然后在这个包含它走的所有路的方格中从0,0开始遍历dfs,到不了的地方vis=false,即为ans++。注意要在搜索范围中再加一圈,因为可能走过的路把这个范围隔开了,就搜索不到。但这是60分的做法,100分做法要用离散化坐标的思想,先放一下。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 2005
using namespace std;
const int zl[][]={{,,,-},{,-,,}};
int n,xi,yi,idx,sum,ans;
bool mp[maxn][maxn],vis[maxn][maxn];
int uup,don,le,ri,stx,sty;
struct pp{
int x,y;
};
pp tur[];
char c[];
void dfs(int xx,int yy)
{
for (int i=;i<=;i++)
{
int ki=xx+zl[][i],kj=yy+zl[][i];
if (ki>=&&kj>=&&ki<=ri&&kj<=uup&&!vis[ki][kj]&&!mp[ki][kj])
{
vis[ki][kj]=true;
sum++;dfs(ki,kj);
}
}
}
int main()
{
freopen("luobo.in","r",stdin);
freopen("luobo.out","w",stdout);
cin>>n;
getchar();
for (int i=;i<=n;i++)
{
c[i]=getchar();
getchar();int a;
scanf("%d",&a);
if (c[i]=='L') {stx-=a;if (stx<le) le=stx;}
else if (c[i]=='R'){stx+=a;if (stx>ri) ri=stx;}
else if (c[i]=='U') {sty+=a;if (sty>uup) uup=sty;}
else if (c[i]=='D'){sty-=a;if (sty<don) don=sty;}
tur[++idx].x=stx;tur[idx].y=sty;
getchar();
}
xi=-le+;yi=-don+;uup+=-don+;ri+=-le+;
mp[xi][yi]=true;
for (int i=;i<=idx;i++)
{
tur[i].x+=-le+;tur[i].y+=-don+;
int a=min(xi,tur[i].x),b=max(xi,tur[i].x),ci=min(yi,tur[i].y),d=max(yi,tur[i].y);
for (int j=a;j<=b;j++)
for (int k=ci;k<=d;k++)
mp[j][k]=true;
xi=tur[i].x;yi=tur[i].y;
}
dfs(,);
for (int i=;i<=ri;i++)
for (int j=;j<=uup;j++)
if (!vis[i][j]) ans++;
printf("%d",ans);
return ;
}

第三题 打地鼠 大意:

  (没错怎么都是游戏的名字)打地鼠,打的这个地鼠的肥胖值一定要比上一个打的大。地鼠最多出现t次,问最多能打多少地鼠。

解:

  看起来是个简单的最长上升序列。但是有一个t次,所以直接扫描加一个循环t就可以了,是不影响的。然后LIS 的nlogn的算法才能过这道题。具体的解释我觉得这个博客讲的就很清楚。http://blog.csdn.net/shuangde800/article/details/7474903

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 100005
using namespace std;
int n,maxx,k,t,a[maxn],d[maxn],ans;
int main()
{
freopen("dishu.in","r",stdin);
freopen("dishu.out","w",stdout);
cin>>k>>n>>maxx>>t;
while (k--)
{
memset(d,,sizeof(d));
int idx;ans=;
for (int i=;i<=n;i++)
scanf("%d",&a[i]);
d[]=a[];ans=;
for(int i=;i<=t;i++)
for (int j=;j<=n;j++)
{
if (a[j]>d[ans]) d[++ans]=a[j];
else {
int pos=lower_bound(d+,d++ans,a[j])-d;//-d not -d-1 ?
d[pos]=a[j];
}
}
printf("%d\n",ans);
}
return ;
}

好好睡一觉,明天联考加油,不要有压力。

【58测试】【贪心】【离散】【搜索】【LIS】【dp】的更多相关文章

  1. 【阿里云产品公测】PTS压力测试WP站搜索

    [阿里云产品公测]PTS压力测试WP站搜索 作者:阿里云用户cnsjw PTS性能测试服务是一个非常非常强大的压力测试工具.可以模拟百人同时访问网站的情况,并监测ECS和RDS的各项指标,生成非常详细 ...

  2. POJ 2533 Longest Ordered Subsequence (LIS DP)

    最长公共自序列LIS 三种模板,但是邝斌写的好像这题过不了 N*N #include <iostream> #include <cstdio> #include <cst ...

  3. 记忆化搜索(DFS+DP) URAL 1223 Chernobyl’ Eagle on a Roof

    题目传送门 /* 记忆化搜索(DFS+DP):dp[x][y] 表示x个蛋,在y楼扔后所需要的实验次数 ans = min (ans, max (dp[x][y-i], dp[x-1][i-1]) + ...

  4. 记忆化搜索(DFS+DP) URAL 1501 Sense of Beauty

    题目传送门 /* 题意:给了两堆牌,每次从首部取出一张牌,按颜色分配到两个新堆,分配过程两新堆的总数差不大于1 记忆化搜索(DFS+DP):我们思考如果我们将连续的两个操作看成一个集体操作,那么这个操 ...

  5. 搜索+简单dp

    前言:即使是简单的递归,在复杂度过高时也可以使用简单的dp. 一般有两种情况,一是利用dp思想求最优子结构进行搜索剪枝,二是利用搜索进行dp数组的填充. 例题一.hdu1978 题目大意:这是一个简单 ...

  6. UVa 10599【lis dp,记忆化搜索】

    UVa 10599 题意: 给出r*c的网格,其中有些格子里面有垃圾,机器人从左上角移动到右下角,只能向右或向下移动.问机器人能清扫最多多少个含有垃圾的格子,有多少中方案,输出其中一种方案的格子编号. ...

  7. [CSP-S模拟测试]:二叉搜索树(DP+贪心)

    题目传送门(内部题99) 输入格式 第一行一个整数$n$,第二行$n$个整数$x_1\sim x_n$. 输出格式 一行一个整数表示答案. 样例 样例输入: 58 2 1 4 3 样例输出: 数据范围 ...

  8. UVALive 4864 Bit Counting --记忆化搜索 / 数位DP?

    题目链接: 题目链接 题意:如果一个数二进制n有k位1,那么f1[n] = k,如果k有s位二进制1,那么f2[n] = f1[k] = s.  如此往复,直到fx[n] = 1,此时的x就是n的”K ...

  9. hdu3555 Bomb (记忆化搜索 数位DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory ...

随机推荐

  1. html5,表单与label标签配套使用

    <form action=""><input type="checkbox" name="dx" value=" ...

  2. oracle 面试题

    1.对数据库SQL2005.ORACLE熟悉吗?   SQL2005是微软公司的数据库产品.是一个RDBMS数据库,一般应用在一些中型数据库的应用,不能跨平台.   ORACLE是ORACLE公司的数 ...

  3. Scala入门学习笔记四--List使用

    前言 本篇将介绍一个和Array很相似的集合List,更多内容请参考:Scala教程 本篇知识点概括 List的构造 List与Array的区别 List的常用方法 List伴生对象的方法 ::和:: ...

  4. 通过Trainingkit对Azure有一个初步的了解

    学习Azure有一个非常不错的资料库Azure training kit. 这里面包含了很多Azure团队编写的实例代码,以及为初学Azure的开发人员准备的新手教学课程. 开发人员可以从http:/ ...

  5. Linux应用程序访问字符设备驱动详细过程【转】

    本文转载自:http://blog.csdn.net/coding__madman/article/details/51346532 下面先通过一个编写好的内核驱动模块来体验以下字符设备驱动 可以暂时 ...

  6. 关于C#中的new的用法

    修饰符:隐藏基类中的成员(是基类中的成员,所以字段.属性.事件等等都可以隐藏,不单单是方法哦) public class Car { public void WriteName(string name ...

  7. Python学习笔记-常用模块

    1.python模块 如果你退出 Python 解释器并重新进入,你做的任何定义(变量和方法)都会丢失.因此,如果你想要编写一些更大的程序,为准备解释器输入使用一个文本编辑器会更好,并以那个文件替代作 ...

  8. Temporary ASP.NET 拒绝访问

    CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\dd813f66 ...

  9. [问题2014S01] 解答

    [问题2014S01] 解答  因为 \(f(x_1,\cdots,x_n)\) 为 \(2\) 次 \(n\) 元对称多项式, 故 \[f(x_1,\cdots,x_n)=a\sum_{i=1}^n ...

  10. jQuery判断当前元素是第几个元素

    $("ul li").click(function () { var index = $("ul li").index(this); alert(index); ...