空间复杂度



考场做法

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

但是这题不会有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. Jetty的安装和配置

    Jetty 是一个开源的servlet容器,它为基于Java的web内容,例如JSP和servlet提供运行环境.Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布.开发人员可以将 ...

  2. mysql查看正在运行的语句

    mysql查看正在运行的语句 并且查看运行最多的mysql语句 MySQL 打开 general log 后,所有的查询语句都会记录在 general log 文件,文件为只读方式,但这样genera ...

  3. LeetCode 746. 使用最小花费爬楼梯(Min Cost Climbing Stairs) 11

    746. 使用最小花费爬楼梯 746. Min Cost Climbing Stairs 题目描述 数组的每个索引做为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i].(索引从 0 ...

  4. Linux基础-13-源码安装软件包

    1.准备 安装必要软件 yum install gcc-* glibc-* -y yum groupinstall '开发工具' -y 2.解包 tar xvf 包名 3.运行configure脚本, ...

  5. docker xfs卡死

    原因 docker在xfs文件系统中,过于频繁create/destory container.pull/push image,当thin pool满时,DeviceMapper后端默认文件系统xfs ...

  6. VMware虚拟机(Ubuntu)通过主机代理实现——浏览器+终端访问外网

    环境说明:主机win10 + 虚拟机ubunut16.04 + 主机s-h-a-d-o-w-socks win10 主机相关操作配置1: 按下 Win + R 快捷键,输入 cmd ,然后在命令行中输 ...

  7. ALV报表——点击事件(二)

    目录 一.ALV点击事件(双击) 一.ALV点击事件(双击) 代码: *Report ZRFI001_XFL_TEST REPORT ZRFI001_XFL_TEST . *定义ALV所需要用到的类型 ...

  8. 几个有益的 CSS 小知识

    样式的顺序 CSS 代码:   HTML 代码:   记得之前这是一道比较火的 CSS 考题,当时好像是有不少的人答错(30% 以上) 答案你们应该是知道的. 可以这样提升 CSS 性能 后代选择器 ...

  9. java之aop使用及自定义注解

    目的: 1.Java注解简介 2.Java元注解(重点) 3.自定义注解 案例一(获取类与方法上的注解值) 案例二(获取类属性上的注解属性值) 案例三(获取参数修饰注解对应的属性值) 4.Aop自定义 ...

  10. Windows方便得运行jar文件

    新建文本文档,文件扩展名为“.bat”,然后输入下面内容: @echo off java -jar % pause 以后就只要拖动jar文件到这个bat文件上就行.