【58测试】【贪心】【离散】【搜索】【LIS】【dp】

时间:2021-11-30 09:03:08

第一题 大天使之剑 大意:

  有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. 记忆化搜索&lpar;DFS&plus;DP&rpar; 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. 记忆化搜索&lpar;DFS&plus;DP&rpar; URAL 1501 Sense of Beauty

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

  5. 搜索&plus;简单dp

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

  6. UVa 10599【lis dp&comma;记忆化搜索】

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

  7. &lbrack;CSP-S模拟测试&rsqb;&colon;二叉搜索树(DP&plus;贪心)

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

  8. UVALive 4864 Bit Counting --记忆化搜索 &sol; 数位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. strom的使用02

    1.grouping分组策略 stream grouping就是用来定义一个stream应该如果分配给Bolts上面的多个Tasks. storm里面有6种类型的stream grouping: 1. ...

  2. 样式hack

    1.CSS 重置 html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, ...

  3. transform的使用

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  4. &lbrack;转&rsqb; Epoll 相对Poll和Select的优点

    http://blog.csdn.net/summerhust/article/details/18260117 PS: 相对select来说,Poll的监听列表比select更短,并且Poll的监听 ...

  5. Django之路由分发系统

    web的基本工作流程 首先,我们先来思考一下我们平常在上网浏览网页时候的场景,大致就是打开一个web浏览器,输入某一个网站的地址,然后转到该网址,在浏览器中得到该网址的页面.从这个场景中我们可以抽象出 ...

  6. &lbrack;转&rsqb;mysql优化——show processlist命令详解

    本文转自:https://blog.csdn.net/sunqingzhong44/article/details/70570728 版权声明:本文为博主原创文章,未经博主允许不得转载. https: ...

  7. 【BZOJ5305】&lbrack;HAOI2018&rsqb;苹果树(组合计数)

    [BZOJ5305][HAOI2018]苹果树(组合计数) 题面 BZOJ 洛谷 题解 考虑对于每条边计算贡献.每条边的贡献是\(size*(n-size)\). 对于某个点\(u\),如果它有一棵大 ...

  8. STL 小白学习(3) vector

    #include <iostream> using namespace std; #include <vector> void printVector(vector<in ...

  9. java-信息安全(十六)-双向认证

    原文地址 http://snowolf.iteye.com/blog/510985 对于双向认证,做一个简单的描述. 服务器端下发证书,客户端接受证书.证书带有公钥信息,用于验证服务器端.对数据加密/ ...

  10. 微软Power BI 每月功能更新系列——12月Power BI 新功能学习

    Power BI Desktop12月产品功能摘要 Power BI 作为实力宠粉达人每月更新不来点新花样,怎么对得起翘首期待的实力铁粉您嘞!一起来看看这一次的Power BI版本的更新又给我们带来了 ...