空间复杂度



考场做法

前有时间复杂度,后有空间复杂度。

但是这题不会有CE情况,所以较为好写。

就用map存复杂度,单层循环就搞定了。

至于判断维度的方法,我是用快读从字符串中读入。

然后不管常数,把所有的n都变成0,判断有几个0就好了。

using namespace std;

map<string,int>M;
char opt[MAXL];
char name[MAXL];
int maxcomp,curcomp; int main()
{
freopen("complexity.in","r",stdin);
freopen("complexity.out","w",stdout);
M["i"]=0;
while(~scanf("%s",opt))
{
if(opt[0]=='S')
{
scanf("%s",name);
maxcomp=0;
}
else if(opt[0]=='E')
{
M[name]=maxcomp;
// cerr<<name<<" comp="<<maxcomp<<endl;
}
else
{
curcomp=M[opt];
// cerr<<" "<<opt<<" comp="<<curcomp<<endl;
fgets(buf,MAXL,stdin);
len=strlen(buf);
buf[--len]=0;
p=0;
for(int i=0;i<len;++i)
if(buf[i]=='n')
buf[i]='0';
while(p<len)
{
int mul=read<int>();
// cerr<<" mul="<<mul<<endl;
if(mul==0)
++curcomp;
}
maxcomp=max(maxcomp,curcomp);
}
}
int ans=0;
for(map<string,int>::iterator i=M.begin();i!=M.end();++i)
ans=max(ans,i->second);
if(ans==0)
{
puts("O(1)");
}
else if(ans==1)
{
puts("O(n)");
}
else
{
printf("O(n^%d)\n",ans);
}
return 0;
}

标解

这东西是用markdown写的,底色挺好看,不知道怎么弄的。

#include <bits/stdc++.h>

#define For(i, l, r) for(register int i = (l), i##end = (int)(r); i <= i##end; ++i)

using namespace std;

template<typename T> inline bool chkmin(T &a, T b) {return b < a ? a = b, 1 : 0;}
template<typename T> inline bool chkmax(T &a, T b) {return b > a ? a = b, 1 : 0;} inline int read() {
int x(0), sgn(1); char ch(getchar());
for (; !isdigit(ch); ch = getchar()) if (ch == '-') sgn = -1;
for (; isdigit(ch); ch = getchar()) x = (x * 10) + (ch ^ 48);
return x * sgn;
} void File() {
freopen ("complexity.in", "r", stdin);
freopen ("complexity.out", "w", stdout);
} map<string, int> M;
int ans = 0; string str; int main () { File(); M["i"] = 0;
int ans = 0; while (cin >> str) {
int maxv = 0;
string name; cin >> name;
while (cin >> str) {
if (str[0] == 'E') break;
int cur = M[str];
cin >> str;
For (j, 0, str.size() - 1)
if (str[j] == 'n') ++ cur;
chkmax(maxv, cur);
}
chkmax(ans, maxv);
M[name] = maxv;
} if (ans == 0) return puts("O(1)"), 0;
if (ans == 1) return puts("O(n)"), 0;
printf ("O(n^%d)\n", ans); return 0; }

std直接找n有几个……我还是太年轻了。

数独



输入格式

输入的前 19 行为一个二维字符数组,为数独的初始状态的方阵格式。

随后一行一个整数 T 表示操作的次数。

随后 T 行,每行为下列形式:

  • Insert x y k,表示在(x, y)位置插入数 k。
  • Delete x y,表示删除(x, y)位置的数。
  • Query x y,表示查询(x, y)位置能填入且不会出现冲突的数。
  • Merge i j,表示合并第 i 次操作后的状态和第j 次操作后的状态。
  • Print,表示查询整个数独的状态。

其中 x 表示行数,从上到下分别为 1 到 9,y 表示列数,从左到右分别为 1到 9。

输出格式

对于每个操作,你需要按照题目描述进行对应的输出。

样例输入输出 1

见题目目录下的 1.in 与 1.ans。

样例输入输出 2

见题目目录下的 2.in 与 2.ans。

该样例的数据规模与第 6 / 7 个测试点相同。

数据规模与约定

所有测试点的数据规模与约定如下:

对于所有的数据,\(1 \leq T \leq 100,1 \leq x, y,k \leq 9\),对于第 a 个操作,若是Merge操作,则\(1 \leq i, j <a\)。保证第一个操作不是 Merge操作。

对于所有的数据,均可能存在查询整个数独的操作,且保证初始状态不存在冲突。

分析

照题目模拟即可。

下标从0开始判同九宫格会很好写。

封装check函数会让代码简洁很多。

#include<iostream>
#include<cstdio>
#include<cstring>
template<class T>T read(T&x)
{
T data=0;
char ch=getchar();
while(!isdigit(ch))
{
ch=getchar();
}
while(isdigit(ch))
{
data=data*10+ch-'0';
ch=getchar();
}
return x=data;
}
using namespace std; const int MAXN=150;
int n,a[20];
struct Soduku
{
int data[9][9]; void init()
{
memset(data,0,sizeof data);
} Soduku()
{
init();
} int*operator[](const int&x)
{
return data[x];
} int chk(int x,int y,int k) // x-1,y-1
{
if(data[x][y]) // err
{
return 1;
}
for(int i=0;i<9;++i)
if(data[x][i]==k) // row
{
return 2;
}
for(int i=0;i<9;++i)
if(data[i][y]==k) // col
{
return 3;
}
int r=x/3,c=y/3;
for(int i=r*3;i<(r+1)*3;++i)
for(int j=c*3;j<(c+1)*3;++j)
if(data[i][j]==k)
{
return 4; // squ
}
return 0; // ok
} void ins(int x,int y,int k) // x-1,y-1
{
int stat=chk(x,y,k);
if(stat==1)
{
puts("Error!");
return;
}
else if(stat==2)
{
puts("Error:row!");
return;
}
else if(stat==3)
{
puts("Error:column!");
return;
}
else if(stat==4)
{
puts("Error:square!");
return;
}
else
{
puts("OK!");
data[x][y]=k;
}
} void del(int x,int y) // x-1,y-1
{
if(!data[x][y])
{
puts("Error!");
return;
}
puts("OK!");
data[x][y]=0;
} void quiz(int x,int y) // x-1,y-1
{
if(data[x][y])
{
puts("Error!");
return;
}
n=0;
for(int k=1;k<=9;++k) // try i
{
if(chk(x,y,k)==0)
a[++n]=k;
}
printf("%d\n",n);
for(int i=1;i<=n;++i)
printf("%d\n",a[i]);
} Soduku operator+(const Soduku&rhs)const
{
Soduku res;
int icnt=0,jcnt=0; // edit 1
for(int i=0;i<9;++i)
for(int j=0;j<9;++j)
{
if(data[i][j]&&res.chk(i,j,data[i][j])==0)
{
res.data[i][j]=data[i][j];
++icnt;
continue;
}
if(rhs.data[i][j]&&res.chk(i,j,rhs.data[i][j])==0)
{
res.data[i][j]=rhs.data[i][j];
++jcnt;
continue;
}
}
printf("%d %d\n",icnt,jcnt);
return res; // eidt 2
} void out()
{
for(int i=0;i<9;++i)
{
puts("+-+-+-+-+-+-+-+-+-+");
for(int j=0;j<9;++j)
printf("|%d",data[i][j]);
printf("|\n");
}
puts("+-+-+-+-+-+-+-+-+-+");
}
}S[MAXN]; int main()
{
freopen("sudoku.in","r",stdin);
freopen("sudoku.out","w",stdout);
for(int i=0;i<9;++i)
for(int j=0;j<9;++j)
read(S[0][i][j]);
int T;
read(T);
// cerr<<"T="<<T<<endl;
char opt[20];
int x,y,k;
for(int i=1;i<=T;++i)
{
S[i]=S[i-1];
scanf("%s",opt);
if(opt[0]=='I') // Insert x y k
{
read(x);read(y);read(k);
--x,--y;
S[i].ins(x,y,k);
}
else if(opt[0]=='D') // Delete x y
{
read(x);read(y);
--x,--y;
S[i].del(x,y);
}
else if(opt[0]=='Q') // Query x y
{
read(x);read(y);
--x,--y;
S[i].quiz(x,y);
}
else if(opt[0]=='M') // Merge i j
{
read(x);read(y);
S[i]=S[x]+S[y];
}
else if(opt[0]=='P') // Print
{
S[i].out();
}
// cerr<<i<<" S="<<endl;
// S[i].out();
}
return 0;
}

test20181102 空间复杂度 和 test20181030 数独的更多相关文章

  1. 【leetcode】sudokuSolver数独解题

    0.摘要 小时候在报纸上玩过数独,那时候觉得很难,前几天在leetcode上遇到了这个题,挺有意思于是记录下来 一般一道数独题,就像他给的例子这样,9*9的格子,满足 行,列 ,宫均取1-9的数,切互 ...

  2. 一次数独生成及解题算法的剖析(Java实现)

    数独生成及解题算法剖析(Java实现) 关键词 数独9x9 数独生成算法 数独解题算法 序言 最近业务在巩固Java基础,编写了一个基于JavaFX的数独小游戏(随后放链接).写到核心部分发现平时玩的 ...

  3. LintCode389.判断数独是否合法

    LintCode简单题:判断数独是否合法 问题描述: 请判定一个数独是否有效. 该数独可能只填充了部分数字,其中缺少的数字用 . 表示. 注意事项: 一个合法的数独(仅部分填充)并不一定是可解的.我们 ...

  4. [LeetCode] Sudoku Solver 求解数独

    Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...

  5. [LeetCode] Valid Sudoku 验证数独

    Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be ...

  6. 斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)

    对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - ) + F(n - ),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围 ...

  7. 数独 JAVA实现

    数独游戏的规则从很久之前就知道,但是一直都没怎么玩过,然后到了大学,大一下学期自己学dfs的时候,刚刚好碰到了一个数独的题目,做出来后,感觉还是挺有成就感的 然后大二学了JAVA,看了下那个一些有关于 ...

  8. 用C++实现的解数独(Sudoku)程序

    我是一个C++初学者,控制台实现了一个解数独的小程序. 代码如下: //"数独游戏"V1.0 //李国良于2016年11月11日编写完成 #include <iostream ...

  9. ACM : POJ 2676 SudoKu DFS - 数独

    SudoKu Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu POJ 2676 Descr ...

随机推荐

  1. ubuntu18.10 安装nodejs

    进入官网下载页面 下载对应版本 2.解压tar.xz文件在linux下,大部分情况下不能直接解压tar.xz的文件. 需要用 xz -d xxx.tar.xz 将 xxx.tar.xz解压成 xxx. ...

  2. 任务调度之Quartz.Net配置文件

    前面介绍的任务的创建执行是通过代码来实现的,当要添加一个任务的时候就非常的不灵活,做不到热插拔.而通过配置文件的方式实现配置化,可以做到在添加一个任务的话,我们可以新建一个类库来定义Job做到热插拔. ...

  3. qt model--view-delegate模式的界面设计概念,ListView用法

    最经典的界面设计模式,必须知道. 作为 一种经典到 不能 再 经典 的 架构 模式, qt的model--view-delegate大 行其 道 有其 必然 的 道理. 通过 把 职责. 性质相近的 ...

  4. Git学习(二)——使用Git协同开发

    项目协同开发git操作 基本流程 1.开发前,拉一次远程仓库 2.工作区进行开发 3.将开发结果提交到本地版本库 git status查看时没有待处理的事件 4.拉取远程仓库(每一次要提交远程仓库前必 ...

  5. 『Python基础』第7节:基本运算符

    一. 基本运算符 运算按种类可以分为: 算数运算.比较运算.逻辑运算.赋值运算.成员运算.身份运算.位运算. 今天我们只学习算数运算.比较运算.逻辑运算.赋值运算.成员运算 1.1 算数运算 以下假设 ...

  6. Spring Boot 集成 Swagger生成接口文档

    目的: Swagger是什么 Swagger的优点 Swagger的使用 Swagger是什么 官网(https://swagger.io/) Swagger 是一个规范和完整的框架,用于生成.描述. ...

  7. Springboot模板(thymeleaf、freemarker模板)

    目的: 1.thymeleaf模板 2.Freemarker模板 thymeleaf模板 thymeleaf 的优点: 支持html5标准,页面无须部署到servlet开发到服务器上,直接通过浏览器就 ...

  8. The 2018 ACM-ICPC Asia Nanjing Regional Programming Contest

    A. Adrien and Austin 大意: $n$个石子, 编号$1$到$n$, 两人轮流操作, 每次删除$1$到$k$个编号连续的石子, 不能操作则输, 求最后胜负情况. 删除一段后变成两堆, ...

  9. RabbitMQ 应用一

    (百度百科)MQ全称为Message Queue,消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们.消息传递指的 ...

  10. .net core 杂记:用Autofac替换内置容器

    官方建议使用内置容器,但有些功能并不支持,如下: 属性注入 基于名称的注入 子容器 自定义生存期管理 Func<T> 支持 所以可以使用其他第三方IOC容器,如Autofac,下面为学习使 ...