首页 > 其他分享 >2022CCPC威海站:DI

2022CCPC威海站:DI

时间:2024-09-02 11:36:50浏览次数:11  
标签:10 13 14 2022CCPC int DI tp 威海 include

又是一个坐牢局,最近几天就不适合写代码。


D. Sternhalma

题意

跳棋。给一个如题中图所示的棋盘,每个格子都带有一个分值,棋盘上某些格子里有一个棋子。可以执行两种操作:1.随便移去一个棋子,不得分;2.设有相邻且共线三个格子u,v,w(v在中间),如果u,v中都有棋子而w没有,可以把u中棋子越过v跳到w位置,然后移去v中棋子,获得v处的分值。现在有n次询问,每次询问告诉你每个格子有无棋子,问能得到的最大分值。

解法

由于只有19个格子,考虑状压,可以用一个数来表示棋盘上的一个棋子摆放状态。手动打出可行的每种状态转移方式,然后类似暴力模拟,求出当前状态的最大分值即可。如果写法不够好而导致TLE,可以在所有询问开始之前,从0开始反向转移状态,求出每个初始状态的最大分值,每次询问后直接输出对应结果即可。

听说有傻子看完题之后整个思路都对,就没想到用状压,真离谱吧,反正不是我。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
const int N = 25;
const int M = 1e6 + 5;

int scr[N], n, cnt[M];
char ch[N];

queue<int> q;
int tp;
bool inq[M];

struct node{
    int u, v, w;
    node(int u1 = 0, int v1 = 0, int w1 = 0){
        u = u1;
        v = v1;
        w = w1;
    }
};
vector<node> ve;

void d(int uu, int vv, int ww){
    ve.push_back(node(uu, vv, ww));
    ve.push_back(node(ww, vv, uu));
}
void init(){
    d(0,1,2); d(2,6,11); d(11,15,18); d(16,17,18); d(7,12,16); d(0,3,7);
    d(0,4,9); d(1,4,8); d(3,4,5); d(1,5,10); d(2,5,9); d(4,5,6);
    d(3,8,13); d(4,8,12); d(7,8,9); d(4,9,14); d(5,9,13); d(8,9,10); d(5,10,15); d(6,10,14); d(9,10,11);
    d(8,13,17); d(9,13,16); d(12,13,14); d(9,14,18); d(10,14,17); d(13,14,15);
}

int main(){
    init();
    int sz = ve.size();
    cin.tie(0);
    for(int i = 0; i < 19; i++){
        cin >> scr[i];
    }

    cnt[0] = 0;
    inq[0] = 1;
    q.push(0);
    int tp, to;
    while(!q.empty()){
        tp = q.front();
        q.pop();
        for(int i = 0; i < 19; i++){
            if(!(tp & (1 << i))){
                to = tp | (1 << i);
                if(!inq[to]){
                    inq[to] = 1;
                    q.push(to);
                }
                cnt[to] = max(cnt[to], cnt[tp]);
            }
        }
        for(int i = 0; i < sz; i++){
            if((!(tp & (1 << ve[i].u))) && (!(tp & (1 << ve[i].v))) && (tp & (1 << ve[i].w))){
                to = tp - (1 << ve[i].w) + (1 << ve[i].u) + (1 << ve[i].v);
                if(!inq[to]){
                    inq[to] = 1;
                    q.push(to);
                }
                cnt[to] = max(cnt[to], cnt[tp] + scr[ve[i].v]);
            }
        }
    }

    cin >> n;
    while(n--){
        int st = 0;
        for(int i = 0; i < 19; i++){
            cin >> ch[i];
            if(ch[i] == '#') st += (1 << i);
        }
        cout << cnt[st] << endl;
    }
    return 0;
}

I. Dragon Bloodline

题意

用一些元素合成龙蛋。合成每个龙蛋需要n种元素,第i种元素需要a[i]个;有k种工具龙可以用来收集元素,第i种工具龙有b[i]个,它们中每个可以任选一种元素,收集2i-1个该种元素。问最多能合成多少个龙蛋。

解法

读完题就在纠结,如何判断一个工具龙是收集需求量大的元素好,还是收集很多需求量少的元素好?很难判断。但是如果先假定一个要合成的龙蛋的个数,再判断能否合成这么多龙蛋,就比较简单:
建立一个优先队列,里面存储每一种元素的总需求量。尽量用收集量大的工具龙,去收集需求量大的元素。这样,浪费掉的收集量一定是最小的。因为收集一定量的元素之后,考虑剩下的工具龙,它们的收集量越“零散”,在后续过程中越不容易造成浪费。
所以,上述过程套上二分答案就行了。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define ll long long
using namespace std;
const int N = 5e4 + 5;

int ti, n, k;
ll a[N], b[25], c[25], num[25];
priority_queue<ll> q;

bool check(ll x){
    while(!q.empty()) q.pop();
    for(int i = 1; i <= n; i++){
        q.push(a[i] * x);
    }
    ll tp, db;
    int p = k;
    while(!q.empty()){
        if(!p) return 0;
        tp = q.top();
        q.pop();
        if(tp > num[p]){
            db = min(tp / num[p], b[p]);
            b[p] -= db;
            tp -= db * num[p];
            if(!b[p]) p--;
            if(tp) q.push(tp);
        }
        else{
            b[p]--;
            if(!b[p]) p--;
        }
    }
    return 1;
}

int main(){
    scanf("%d", &ti);
    while(ti--){
        scanf("%d%d", &n, &k);
        ll totnd = 0;
        for(int i = 1; i <= n; i++){
            scanf("%d", &a[i]);
            totnd += a[i];
        }
        for(int i = 1; i <= k; i++){
            scanf("%d", &b[i]);
            c[i] = b[i];
        }
        num[1] = 1;
        for(int i = 2; i <= k; i++){
            num[i] = num[i - 1] * 2;
        }
        ll totnum = 0;
        for(int i = 1; i <= k; i++){
            totnum += num[i] * b[i];
        }
        ll l = 1, r = totnum / totnd, mid, ans = 0;
        bool rst;
        while(l <= r){
            mid =(l + r) / 2;
            for(int i = 1; i <= k; i++){
                b[i] = c[i];
            }
            rst = check(mid);
            if(!rst){
                r = mid - 1;
            }
            else{
                ans = max(ans, mid);
                l = mid + 1;
            }
        }
        printf("%lld\n", ans);
    }
    return 0;
}

标签:10,13,14,2022CCPC,int,DI,tp,威海,include
From: https://www.cnblogs.com/qjsswz/p/18392416

相关文章

  • 初识 Embedding,为何大家都基于它搭建私人智能客服?
    随着AI技术的发展,大家在日常使用过程中经常会碰到一些目前GPT4也无法解决的问题:无法获取个人私有数据信息,进行智能问答无法获取最新信息,LLM模型训练都是都是有截止日期的无法定制化私有的专属模型,从而在某个领域内取得更好效果基于以上问题OpenAI官方提供了两种不......
  • mac M1 android studio 安装
    1、官网下载安装包https://developer.android.google.cn/studio?hl=en2、下载完成后,双击安装,中间需要配置代理这个,配置即可,然后点击下一步一直安装 3、到最后的时候会安装androidsdk报错,这个时候打开下面的地址看哪个时间最短,然后配置host代理https://ping.chinaz.com/dl.......
  • 【赵渝强老师】Redis的管道Pipeline
      Redis使用的是客户端-服务器(C-S)模型和请求/响应协议的TCP服务器。这意味着通常情况下一个请求会遵循以下步骤:第一步:客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。第二步:服务端处理命令,并将结果返回给客户端。  视频讲解如下:Redis的管道Pi......
  • OpenAI Gym custom environment: Discrete observation space with real values
    题意:OpenAIGym自定义环境:具有实数值的离散观测空间问题背景:Iwouldliketocreatecustomopenaigymenvironmentthathasdiscretestatespace,butwithfloatvalues.Tobemoreprecise,itshouldbearangeofvalueswith0.25step:10.0,10.25,10.5,10......
  • Codeforces Round 969 Div.2+Div.1
    A.Dora'sSet注意到任意两个偶数的\(\gcd\)都大于\(1\),因此选择的三个数中至多一个偶数,而注意到相邻的奇数一定互质,因此每次选两个奇数一个偶数,答案=奇数的个数÷2点击查看代码#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#defineullunsigned......
  • PHP转Go系列 | ThinkPHP与Gin框架之Redis延时消息队列技术实践
    大家好,我是码农先森。我们在某宝或某多多上抢购商品时,如果只是下了订单但没有进行实际的支付,那在订单页面会有一个支付倒计时,要是过了这个时间点那么订单便会自动取消。在这样的业务场景中,一般情况下就会使用到延时队列。通常在客户下单之后,就会将订单数据推送到延时队列中并且......
  • ShardingSphere-JDBC实现数据加解密
    一、什么是ShardingSphere?        ShardingSphere定位为轻量级Java框架,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。ApacheShardingSphere旨......
  • Redis
    Redis数据类型五种基本字符串String列表List集合Set有序集合SortedSet也叫ZSet哈希Hash五种高级消息队列Stream地理空间Geospatial…启动:输入redis-server启动redis客户端:redis-cli操作StringsetNamefyq:添加getName:获取delName:删......
  • 威海市专业技术人员继续教育刷课脚本-JavaScript编写
    脚本学习网站:sdwh.yxlearning.com,rsjwhjxjy.weihai.cn脚本地址:威海市专业技术人员继续教育-刷课脚本教程1.插件安装(以MicrosoftEdge浏览器为例)打开最中间那个蓝色绿色的浏览器,谷歌之类的浏览器也可以点击屏幕右上角三个点,图示位置,然后点击扩展点击获取扩展搜索Tamp......
  • Radiant Photo 1.4.1激活版 AI智能完美照片修图插件详细安装教程(附下载链接)
    前言RadiantPhoto是一款高效的照片编辑与增强应用。这款软件配备了多样化的编辑工具及特效,使得用户能够便捷地改善、修正并提升图片质量,让照片看起来更为出色且引人注目。无论你是日常使用者还是专业的摄影人士,都能够借助这款应用来增强照片的表现力,让它们更具吸引力。一、下载......