codeforces589G - Hiring(好题)

本文介绍了一种使用树状数组和二分查找解决工作安排问题的方法,通过排序和动态更新来优化工作日程,实现高效的工作任务分配。

题意:

一天可以工作ti时间,有n天,问一个工作者最多可以在第几天完成他的工作

一天工作之前必须先要准备xi的时间


由题意可知,要想完成这份工作,一定要在ti>xi的天数中做工作

已经知道了哪几天这个人会去工作,那么显然二分答案

所以问题便成为了求哪几天他会去工作,所以联想到用树状数组去维护,

首先先对时间升序排序,对准备时间升序排序

反向循环,当时间大于准备时间时,便把这天的准备时间加入到树状数组中,同时再利用一个树状数组,对天数+1

#include <map>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <ctime>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define inf -0x3f3f3f3f
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define mem0(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define mem(a, b) memset(a, b, sizeof(a))
typedef long long ll;
int n,m;
const int maxn=200000+1000;
int ans[maxn];
__int64 sum[maxn],cnt[maxn];
struct Day{
    int id;
    __int64 num;
    friend bool operator <(Day a,Day b){
        return a.num < b.num; //num小的结构体优先
    }
}t[maxn];

struct task{
    __int64 prepare,cost;
    int id;
    friend bool operator <(task a,task b){
        return a.prepare < b.prepare; //prepare小的结构体优先
    }
}people[maxn];

__int64 query(__int64 c[],int x){
    __int64 ret=0;
    while(x>0){
        ret+=c[x];
        x-=(x&-x);
    }
    return ret;
}

void add(__int64 c[],int x,__int64 d){
    while(x<=m){
        c[x]+=d;
        x+=(x&-x);
    }
}

bool check(int i,int x){
    __int64 tmp1=query(cnt,x),tmp2=query(sum,x);
    if(tmp1*people[i].prepare+people[i].cost<=tmp2)
        return true;
    return false;
}

int main(){
    while(scanf("%d%d",&n,&m)!=EOF){
        for(int i=1;i<=m;i++){
            scanf("%I64d",&t[i].num);
            t[i].id=i;
        }
        for(int i=1;i<=n;i++){
            scanf("%I64d%I64d",&people[i].prepare,&people[i].cost);
            people[i].id=i;
        }
        sort(t+1,t+m+1);
        sort(people+1,people+n+1);
        int j=m;
        for(int i=n;i>=1;i--){
            while(j&&t[j].num>=people[i].prepare){
                add(sum,t[j].id,t[j].num);//把能处理任务的天数加进去
                add(cnt,t[j].id,1);//把i天处理的天数记录
                j--;
            }
            int low=1,high=m+1;
            while(high-low>=0){
                int mid=(high+low)/2;
                if(check(i,mid))
                    high=mid-1;
                else
                    low=mid+1;
            }
            if(high!=m+1)
                ans[people[i].id]=low;
            else
                ans[people[i].id]=0;
        }
        printf("%d",ans[1]);
        for(int i=2;i<=n;i++)
            printf(" %d",ans[i]);
        printf("\n");
    }
    return 0;
}


基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究(Matlab代码实现)内容概要:本文围绕“基于数据驱动的Koopman算子的递归神经网络模型线性化”展开,旨在研究纳米定位系统的预测控制方法。通过结合数据驱动技术与Koopman算子理论,将非线性系统动态近似为高维线性系统,进而利用递归神经网络(RNN)建模并实现系统行为的精确预测。文中详细阐述了模型构建流程、线性化策略及在预测控制中的集成应用,并提供了完整的Matlab代码实现,便于科研人员复现实验、优化算法并拓展至其他精密控制系统。该方法有效提升了纳米级定位系统的控制精度与动态响应性能。; 适合人群:具备自动控制、机器学习或信号处理背景,熟悉Matlab编程,从事精密仪器控制、智能制造或先进控制算法研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①实现非线性动态系统的数据驱动线性化建模;②提升纳米定位平台的轨迹跟踪与预测控制性能;③为高精度控制系统提供可复现的Koopman-RNN融合解决方案; 阅读建议:建议结合Matlab代码逐段理解算法实现细节,重点关注Koopman观测矩阵构造、RNN训练流程与模型预测控制器(MPC)的集成方式,鼓励在实际硬件平台上验证并调整参数以适应具体应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值