首页 > 其他分享 >uva101The Blocks Problem

uva101The Blocks Problem

时间:2023-12-05 10:45:48浏览次数:35  
标签:Blocks int over move back pop uva101The Problem block

原题链接The Blocks Problem - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

一道模拟题。(水题) 但模拟过程很有意思,怎么样才能用最短的代码完成所有操作,使代码更简洁是很考验技术的。

 

#include<bits/stdc++.h>
using namespace std;
vector<int> block[30]; 
vector<int> m;
void find_block(int x,int c[]) {
    while (block[c[x]].back()!=x) {
        int y=block[c[x]].back();
        block[c[x]].pop_back();
        c[y]=y;
        block[c[y]].push_back(y);
    }
}
void move_onto(int a,int b,int c[]) {
    find_block(a,c);
    find_block(b,c);
    block[c[a]].pop_back();
    block[c[b]].push_back(a);
    c[a]=c[b];
}
void move_over(int a,int b,int c[]) {
    find_block(a,c);
    block[c[a]].pop_back();
    block[c[b]].push_back(a);
    c[a]=c[b];
}
void pile_over(int a,int b,int c[]) {
    while (block[c[a]].back()!=a) {
        int y=block[c[a]].back();
        block[c[a]].pop_back();
        m.push_back(y);
    }
    m.push_back(block[c[a]].back());
    block[c[a]].pop_back();
    while (!m.empty()) {
        int y=m.back();
        m.pop_back();
        c[y]=c[b];
        block[c[b]].push_back(y);
    }
}
int main() {
    int n;
    cin>>n;
    int c[n+10];
    for (int i=0; i<n; i++) {
        block[i].push_back(i);
        c[i]=i;
    }
    string s,s1;
    int a,b;
    do {
        cin>>s;
        if (s!="quit") {
            cin>>a>>s1>>b;
            if (c[a]==c[b]) continue;
            if (s=="move" && s1=="onto") move_onto(a,b,c);
            if (s=="move" && s1=="over") move_over(a,b,c);
            if (s=="pile" && s1=="onto") {
                find_block(b,c);
                pile_over(a,b,c);
            }
            if (s=="pile" && s1=="over") pile_over(a,b,c);
        }
    } while (s!="quit");
    for (int i=0; i<n; i++) {
        printf("%d:",i);
        for (int j=0; j<block[i].size(); j++) printf(" %d",block[i][j]);
        printf("\n");
    }
    return 0;
}

Ps:使用函数vector中的resize()可以使代码更简洁。

 

标签:Blocks,int,over,move,back,pop,uva101The,Problem,block
From: https://www.cnblogs.com/purple123/p/17876667.html

相关文章

  • kubeblocks的使用
    介绍:它是基于Kubernetes的云原生数据基础设施,为用户提供了关系型数据库、NoSQL数据库、向量数据库以及流计算系统的管理控制功能。可以使用提供的命令轻松部署处理数据库实例。github:https://github.com/apecloud/kubeblocks官网:https://kubeblocks.io1.初步使用安装kbcli:......
  • 关于解决vue报错"Problems loading reference 'https://schemastore.azurewebsites.ne
    打开setting时会看到有一条三角形的警告信息 看问题描述:无法从该网站加载解决方法:打开设置,找到扩展下的json项 设置之后可以在settings.json文件中看到新增加一项 "json.schemaDownload.enable":false可以直接在界面上设置: "json.schemaDownload.enable":false......
  • P2522 [HAOI2011] Problem b
    题意求\(\sum_{i=a}^{b}\sum_{j=c}^{d}[\gcd(i,j)=k]\)。Sol简单容斥一下。\[\begin{aligned}\sum_{i=a}^{b}\sum_{j=c}^{d}[\gcd(i,j)=k]&=\sum_{i=1}^{b}\sum_{j=1}^{d}[\gcd(i,j)=k]\\&-\sum_{i=1}^{b......
  • Problem: E. Chocolate Bar
    题意:给定一个nm个方块组成的巧克力块,最终要吃到k个方块有两种切的方式:(nm)1.横着切,成本是mm2.竖着切,成本是nn做法:考虑记忆化搜索,使用dp[n][m][k]代表一个n*m的巧克力最后要得到k块所需要的最小成本状态转移:把每一次切的动作看作是一次转移:以n,m,k为例1.横着切,那么每......
  • Problem: B. Queries on a String
    题意简述:给出一个字符串,每次给定l,r,k,选择一个子串l-r,然后子串向右移动k个单位.做法:每次k对子串的长度取模,然后模拟即可(使用substr函数截取前半段和后半段,交换前半段和后半段即可)点击查看代码//Problem:B.QueriesonaString//Contest:Codeforces-EducationalCo......
  • Problem: A. Tricky Sum
    A:做法:数据比较小,用求和公式(n+1)*n/2,减去所有2的幂即可点击查看代码//Problem:A.TrickySum//Contest:Codeforces-EducationalCodeforcesRound1//URL:https://codeforces.com/contest/598/problem/A//MemoryLimit:256MB//TimeLimit:1000ms//Aut......
  • 论文:FEED-FORWARD NETWORKS WITH ATTENTION CAN SOLVE SOME LONG-TERM MEMORY PROBLEM
    题目:FEED-FORWARDNETWORKSWITHATTENTIONCANSOLVESOMELONG-TERMMEMORYPROBLEMS”(Raffel和Ellis,2016,p.1)“带有注意力的前馈网络可以解决一些长期记忆问题”(Raffel和Ellis,2016,p.1)(pdf)这篇论文提出了一种适用于前馈神经网络的简化注意力模型,并展示了......
  • The Design of Feedback Control Systems--Advanced Problems
    AP10.1Athree-axispick-and-placeapplicationrequirestheprecisemovementofaroboticarminthree-dimensionalspace,asshowninFigureAP10.1forjoint2.Thearmhasspecificlinearpathsitmustfollowtoavoidotherpiecesofmachinery.Theovers......
  • [ABC315Ex] Typical Convolution Problem
    题目链接首先观察到这个形式,容易发现它和常规的卷积不同点就在于:题目给出的求和定义中,\(\sum\)符号下面的式子是\(i+j<N\)求和而不是\(i+j=N\)。为了方便计算,我们引入:\[G_n=\sum_{i+j<N}F_iF_j\]我们发现,假设所有\(F_{1\sim{i-1}}\)已经求解完毕了,那么我们就可以通过之......
  • 2023 合肥站 热身赛 B Problem F. Flower’s Land 换根dp 依赖背包
    传送门。求出包含某个点连通块大小为K的权值和最大值。钦定1为根节点,只求根节点的答案,其实是一个依赖性01背包问题可以\(nk\)的时间内解决。考虑进行换根操作,由于背包是取max的背包没办法进行背包的删除,然而取前后缀背包背包的合并为\(k^2\)复杂度过高。当时还有一个想法是点......