【NWPU2018 练着玩】入门班day1 枚举贪心[Cloned]

本文分享了作者在暑期ACM竞赛中遇到的问题及解决思路,包括贪心算法在G题和H题的应用,以及A题FilpGame中的搜索策略。通过对具体题目解析,展示了如何利用贪心策略、搜索算法和尺取法解决实际问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

G - 今年暑假不AC

我真是服了...

本来想写道水题然后去写工数,结果卡了快半小时。最后发现ans忘了每次清零了QAQ

言归正传,典型的贪心。很容易让人想到智力大冲浪。只不过这道题每个任务价值一定,时间不同。

贪心策略:先完成持续时间短的

#include <iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
int n;
struct Node{
    int L,R;
   int tim;
    bool operator <(const Node& b) const {
 return tim<b.tim;}
};
Node a[110];
int t[110],ans=0;
int main()
{
    for(;;)
     {
         ans=0;
         cin>>n;
         if(!n) break;
        for(int i=1;i<=n;i++) {cin>>a[i].L>>a[i].R;a[i].tim=a[i].R-a[i].L;}
        sort(a+1,a+n+1);
        memset(t,0,sizeof(t));
       // for(int i=1;i<=n;i++) cout<<a[i].tim<<endl;
        for(int i=1;i<=n;i++)
        {
            int flag=1;
            for(int j=a[i].L;j<a[i].R;j++)
                if(t[j]) {flag=0;break;}
            if(!flag) continue;
            for(int j=a[i].L;j<a[i].R;j++) t[j]=1;
            ans++;
        }
        cout<<ans<<endl;
     }
    return 0;
}

 

H-hero

典型的贪心。大意为你要1VN,你每次打1,受伤害为对方所有人攻击力之和,求将所有敌人击败前,你受伤害的最小值。

只要按照伤害/血量排序即可

A-Filp Game

题意:有一个4*4的棋盘,棋盘上有黑白格,每一次你可以翻其中的一个格子。一个格子(x,y)如果被翻,它相邻的前后左右四个格子(如果在棋盘上)也要翻转。现在给你一个初始的棋盘状态,问把这个棋盘翻转到全黑或全白的最少次数;若不能达到全黑或全白,输出Impossible。

搜索,用DFS 好像BFS也可以?我是枚举了所有情况,后来看题解发现只要枚举第一行就行了,往后翻转情况是确定的。太强了orz

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int dx[] = {0, 0, 0, 1, -1};
int dy[] = {0, 1, -1, 0, 0};
int ans = 0x3f3f3f3f;
int flip(int xx, int yy, int tmp)//依次翻转五个格子
{
    for (int i=0; i<5; i++) {
        int x = xx + dx[i], y = yy + dy[i];
        if (x >=0 && x <4 && y>=0 && y < 4)
            tmp ^= 1 << (x * 4 + y);
    }
    return tmp;
}
//cur当前行,num当前步数,state当前棋盘状态,flag表示期望黑或白
void dfs(int cur, int num, int state, int flag)
{
    if (cur == 4 && (state == 0xffff || state == 0)) {//更新答案
        ans = min(ans, num);
    }
    if (cur == 4) return;//返回条件
    int i = cur - 1;
    for (int j=0; j<4; j++) {//使上一行全黑/白
        if (((state & (1 << (i * 4 + j))) >> (i * 4 + j)) ^ flag) {
            state = flip(cur, j, state);
            num++;
            continue;
        }
    }
    dfs(cur + 1, num, state, flag);
}
void solve(int st)
{
    for (int i=0; i<16; i++) {//枚举第一行
        int num = 0, state = st;
        for (int j=0; j<4; j++) {
            if (i & (1 << j)) {
                state = flip(0, j, state);
                num++;
            }
        }
        dfs(1, num, state, 0);
        dfs(1, num, state, 1);
    }
    if (ans == 0x3f3f3f3f)
        puts("Impossible");
    else printf("%d\n", ans);
}
int main()
{
    char s[8];
    int st = 0;
    for (int i=0; i<4; i++) {
        scanf("%s", s);
        for (int j=0; j<4; j++) {
            st <<= 1;
            st += (s[j] == 'b') ? 1 : 0;
        }
    }
    solve(st);
    return 0;
}

B-Unique Snowflakes

用到了尺取法set函数

单独拉出来写,在此不再赘述。

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值