CF #575 Div3

 // 比赛链接:https://codeforces.com/contest/1196

 // CF 2019.7.24

 // 本想Div3手速场上分,结果卡在C题,掉了不少分。

 // 自闭了这么久,今天补题,吸取教训。

 

 

A - Three Piles of Candies

题意:

比赛时候看了半天也没看明白,真是sb了。

Alice与Bob要把三堆糖果尽可能地平分,两人轮流拿,最后一个拿的要保证两人一样多。否则的话如果最后谁多了就要扔掉,直到两人拿的糖果数量相等。

给定三堆糖果初始数量,求他们能平分到的最多糖果数量。

题解:

三个数求和 / 2 就是答案。(奇数相当于向下取整了)

AC代码:

略。

 

 

B - Odd Sum Segments

题意:

有 n 个数字 a1,a2,…… an,要把他们分割成 k 段,每段和都为奇数。若能实现,输出YES和划分情况,否则输出NO。

题解:

显然 ai 为偶数对每段的和没有贡献,只要统计奇数个数不少于 k 且多余的奇数和为偶数就能完成划分。

从前往后扫一遍即可。(注意格式,我都服气WA了五次。。。心态炸裂)

AC代码:(补题时候头脑怎么如此清醒2min就写好1A???)

#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;

ll a[200010];

int main() {
    int q; cin>>q;
    while(q--) {
        int n, k;
        int cnt = 0;   // 奇数个数
        scanf("%d %d", &n, &k);
        for(int i=1;i<=n;i++) {
            scanf("%lld", &a[i]);
            if(a[i]%2) ++cnt;
        }

        if(cnt<k || (cnt-k)%2==1) { 
            printf("NO\n");
            continue;
        }

        printf("YES\n");
        for(int i=1;i<=n && k>1;i++) {
            if(a[i]%2==1) {
                printf("%d ", i);
                --k;
            }
        }
        printf("%d\n", n);  // 最后一段 n 结尾

    }
    return 0;
}
View Code

 

 

C - Robot Breakout

题意:

平面上有 n 个机器人,机器人可以上下左右四个方向移动,但机器人出了问题,只具备其中某些方向移动的能力。给出 n 个机器人的坐标及可以移动的方向,求出 n 个机器人都可以抵达的一点(X, Y)。

题解:

分析一下可知,机器人能向上移动时,(x, y+n)都能抵达;机器人能向下移动时,(x, y-n)都能抵达;对 x 方向同理。

所以比赛时候我sb地把能到的区域求交(而忽略了不能到的区域)。

反过来想:

用不能走到的区域更新能到的区域。(默认能到达平面上全部点)

初始时,取down = left = -INF,up = right = INF,全部平面上的点(x, y) 满足 down <= x <= up,left <= y <= right,用四个边界来表示。

加入一个机器人,某个方向不能移动则与边界值求交(同小取小,同大取大)。

AC代码:

#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;

int main() {
    int q; cin>>q;
    while(q--) {
        int n;
        int x, y, left, right, up, down;
        int minX = -100000;
        int maxX = 100000;
        int minY = -100000;
        int maxY = 100000;  // 题目规定了平面大小,就不要设更大的值

        scanf("%d", &n);
        while(n--) {
            scanf("%d %d %d %d %d %d", &x, &y, &left, &up, &right, &down);

            if(!left)
                minX = max(minX, x);
            if(!right)
                maxX = min(maxX, x);
            if(!up)
                maxY = min(maxY, y);
            if(!down)
                minY = max(minY, y);
        }
        if(minX<=maxX && minY<=maxY)
            printf("1 %d %d\n", minX, minY);
        else
            printf("0\n");
    }
    return 0;
}
View Code

 

 

D1 - RGB Substring (easy version)

题意:

将一个含有RGB字母的字符串改变最少的字符使其包含字符串“RGBRGB..."的长度为 k 的子串,求改动的字符数量最小值。

题解:

easy版本字符串的长度不超过3000,暴力就能解决。(枚举 s 串起点终点记录改变数量)

AC代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
char s[2010];
char p[] = "RGBRG";
int main() {
    int q; cin>>q;
    while(q--) {
        int n, k;
        scanf("%d %d", &n, &k);
        scanf("%s", s);

        int len = strlen(s);
        int ans = 0x3f3f3f3f;
        for(int i=0;i+k<=len;i++) {
            for(int st=0;st<3;st++) {
                int now = 0;
                for(int kk=0;kk<k;kk++) {
                    if(s[i+kk]!=p[st+kk%3]) ++now;
                }
                ans = min(ans, now);
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}
View Code

 

 

D2 - RGB Substring (hard version)

题意:

同上一题,长度更新为 n<= 2e5。

题解:

简单dp。

记录每一位不同后,只需要滑动长度为 k 的串,改动数量由 dp[i+1],dp[i-k]处的变化更新。

AC代码:(RE一次忘记开大内存了)

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
char s[200010];
char p[] = "RGBRG";

int dp[3][200010];
int main() {
    int q; cin>>q;
    while(q--) {
        int n, k;
        scanf("%d %d", &n, &k);
        scanf("%s", s);

        int len = strlen(s);
        for(int st=0;st<3;st++) {
            for(int i=0;i<len;i++) {
                dp[st][i] = (s[i]!=p[st+i%3]);
            }
        }
        
        int ans = 0x3f3f3f3f;
        for(int st=0;st<3;st++) {
            int now = 0;
            for(int i=0;i<k;i++) {
                now += dp[st][i];
            }
            ans = min(ans, now);
            for(int i=k;i<len;i++) {
                now += dp[st][i];
                now -= dp[st][i-k];
                ans = min(ans, now);
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}
View Code

 

 // 补题不超过20分钟能A,比赛能保持这速度就好了 O.O

 

 

E - Connected Component on a Chessboard

题意:

文化差异方面的原因吗?看半天也看不懂题。

看了别人博客的题目说明,原来是要在国际象棋上选 b个黑色格子,w 个白色格子(满足全部格子连通的条件)。给出b + w 个格子的坐标。

题解:

一个白色格子有4个黑色相邻,两个白色格子有4+3个相邻,n 个白色格子有 3*n + 1 个黑色格子相邻。

所以只要 b <= 3*w + 1 或者 w <= 3*b + 1 就能构造出解。

AC代码:

#include<cstdio>
#include<iostream>
using namespace std;
// 原题 b == black w == white
// 潜意识里b当做白块了,读取交换了w,b的含义
int main() {
    int q; cin>>q;
    while(q--) {
        int add = 0;
        int b, w;
        scanf("%d %d", &w, &b);
        if(b>w) {
            swap(b, w);
            add = 1;
        }

        if(w>3*b+1) {
            printf("NO\n");
            continue;
        }

        printf("YES\n");
        for(int i=1;i<=b;i++) { // 白块
            printf("%d %d\n", 2+add, i*2);
        }
        for(int i=0;i<=b && w;i++) { // 黑块>=白块,放左右两边
            printf("%d %d\n", 2+add, i*2+1);
            --w;
        }
        for(int i=1;i<=b && w;i++) { // 黑块放白块上面
            printf("%d %d\n", 1+add, i*2);
            --w;
        }
        for(int i=1;i<=b && w;i++) { // 黑块放白块下面
            printf("%d %d\n", 3+add, i*2);
            --w;
        }
    }
    return 0;
}
View Code

 

 

F - K-th Path

题意:

给出一个无向图,求图上所有路径中第 k 长的长度。

题解:

突破口是 k 的范围,k = min(n*(n+1)/2, 400),k 不超过400。

可以想到,第 k 短路至少在 边权第 k 大的边上,所有边权排在400以后的对图上两点最短路没有任何贡献。

只需要记录前 k 条边的节点,利用Floyd算法跑两点间的最短路即可。

AC代码:

#include<cstdio>
#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;

ll dis[810][810];
int n, m, k;
struct Edge {
    int u, v;
    ll w;
    bool operator<(const Edge& a)const {
        return w<a.w;
    }
}edge[200010];
vector<int> node;

int main() {
    cin>>n>>m>>k;
    for(int i=0;i<m;i++) {
        scanf("%d %d %lld", &edge[i].u, &edge[i].v, &edge[i].w);
    }
    sort(edge, edge+m);

    for(int i=0;i<min(m, k);i++) {
        node.push_back(edge[i].u);
        node.push_back(edge[i].v);
    }

    // 离散化
    sort(node.begin(), node.end());
    node.resize(unique(node.begin(), node.end())-node.begin());

    memset(dis, 0x3f, sizeof(dis));
    for(int i=0;i<min(m, k);i++) {
        int x = lower_bound(node.begin(), node.end(), edge[i].u)-node.begin();
        int y = lower_bound(node.begin(), node.end(), edge[i].v)-node.begin();
        dis[x][y] = dis[y][x] = min(dis[x][y], edge[i].w);
    }

    // Floyd
    for(int l=0;l<node.size();l++) {
        for(int i=0;i<node.size();i++) {
            for(int j=0;j<node.size();j++) {
                dis[i][j] = min(dis[i][j], dis[i][l]+dis[l][j]);
            }
        }
    }

    // 注意 i,j 不能重复, j = i + 1
    vector<ll> ans;
    for(int i=0;i<node.size();i++) {
        for(int j=i+1;j<node.size();j++) {
            ans.push_back(dis[i][j]);
        }
    }

    sort(ans.begin(), ans.end());
    printf("%lld\n", ans[k-1]);

    return 0;
}
View Code

 

 


 

(End) 

 

转载于:https://www.cnblogs.com/izcat/p/11355091.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自动控制节水灌溉技术的高低代表着农业现代化的发展状况,灌溉系统自动化水平较低是制约我国高效农业发展的主要原因。本文就此问题研究了单片机控制的滴灌节水灌溉系统,该系统可对不同土壤的湿度进行监控,并按照作物对土壤湿度的要进行适时、适量灌水,其核心是单片机和PC机构成的控制部分,主要对土壤湿度与灌水量之的关系、灌溉控制技术及设备系统的硬件、软件编程各个部分进行了深入的研究。 单片机控制部分采用上下位机的形式。下位机硬件部分选用AT89C51单片机为核心,主要由土壤湿度传感器,信号处理电路,显示电路,输出控制电路,故障报警电路等组成,软件选用汇编语言编程。上位机选用586型以上PC机,通过MAX232芯片实现同下位机的电平转换功能,上下位机之通过串行通信方式进行数据的双向传输,软件选用VB高级编程语言以建立友好的人机界面。系统主要具有以下功能:可在PC机提供的人机对话界面上设置作物要的土壤湿度相关参数;单片机可将土壤湿度传感器检测到的土壤湿度模拟量转换成数字量,显示于LED显示器上,同时单片机可采用串行通信方式将此湿度值传输到PC机上;PC机通过其内设程序计算出所需的灌水量和灌水时,且显示于界面上,并将有关的灌水信息反馈给单片机,若需灌水,则单片机系统启动鸣音报警,发出灌水信号,并经放大驱动设备,开启电磁阀进行倒计时定时灌水,若不需灌水,即PC机上显示的灌水量和灌水时均为0,系统不进行灌水。
智慧农业是一种结合了现代信息技术,包括物联网、大数据、云计算等,对农业生产过程进行智能化管理和监控的新模式。它通过各种传感器和设备采集农业生产中的关键数据,如大气、土壤和水质参数,以及生物生长状态等,实现远程诊断和精准调控。智慧农业的核心价值在于提高农业生产效率,保障食品安全,实现资源的可持续利用,并为农业产业的转型升级提供支持。 智慧农业的实现依赖于多个子系统,包括但不限于设施蔬菜精细化种植管理系统、农业技术资料库、数据采集系统、防伪防串货系统、食品安全与质量追溯系统、应急追溯系统、灾情疫情防控系统、农业工作管理系统、远程诊断系统、监控中心、环境监测系统、智能环境控制系统等。这些系统共同构成了一个综合的信息管理和服务平台,使得农业生产者能够基于数据做出更加科学的决策。 数据采集是智慧农业的基础。通过手工录入、传感器自动采集、移动端录入、条码/RFID扫描录入、拍照录入以及GPS和遥感技术等多种方式,智慧农业系统能够全面收集农业生产过程中的各种数据。这些数据不仅包括环境参数,还涵盖了生长状态、加工保存、检验检疫等环节,为农业生产提供了全面的数据支持。 智慧农业的应用前景广阔,它不仅能够提升农业生产的管理水平,还能够通过各种应用系统,如库房管理、无公害监控、物资管理、成本控制等,为农业生产者提供全面的服务。此外,智慧农业还能够支持政府监管,通过发病报告、投入品报告、死亡报告等,加强农业产品的安全管理和质量控制。 面对智慧农业的建设和发展,存在一些挑战,如投资成本高、生产过程标准化难度大、数据采集和监测的技术难题等。为了克服这些挑战,需要政府、企业和相关机构的共同努力,通过政策支持、技术创新和教育培训等手段,推动智慧农业的健康发展。智慧农业的建设需要明确建设目的,选择合适的系统模块,并制定合理的设备布署方案,以实现农业生产的智能化、精准化和高效化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值