topcoder srm 702 div1 -3

时间:2022-09-30 22:12:05

1、给定一个$n*m$的矩阵,里面的数字是1到$n*m$的一个排列。一个$n*m$矩阵$A$对应一个$n*m$ 的01字符串,字符串的位置$i*m+j$为1当且仅当$A_{i,j}=i*m+j+1$。现在可以交换矩阵的两列或者两行。在任意多次操作后使得矩阵对应的字符串最大?

思路:从1到$n*m$,依次枚举。每次将当前数字填回正确位置。比较该次操作前后是否变大。不变大则不做本次操作。

#include <stdio.h>
#include <vector>
#include <string>
using namespace std; class GridSortMax
{
int a[55][55];
int b[55][55];
int N,M; void reset(int t) {
for(int i=0;i<N;++i) for(int j=0;j<M;++j) {
if(t==0) b[i][j]=a[i][j];
else a[i][j]=b[i][j];
}
} pair<int,int> get(int t) {
for(int i=0;i<N;++i) {
for(int j=0;j<M;++j) {
if(a[i][j]==t) return make_pair(i,j);
}
}
} void swapCol(int y1,int y2) {
for(int i=0;i<N;++i) swap(a[i][y1],a[i][y2]);
} void swapRow(int x1,int x2) {
for(int i=0;i<M;++i) swap(a[x1][i],a[x2][i]);
} string getAns() {
string s="";
for(int i=0;i<N;++i) for(int j=0;j<M;++j) {
if(a[i][j]==i*M+j+1) s+="1";
else s+="0";
}
return s;
} public:
string findMax(int n,int m,vector<int> grid)
{
for(int i=0;i<n;++i) {
for(int j=0;j<m;++j) {
a[i][j]=grid[i*m+j];
}
}
N=n;
M=m;
for(int i=1;i<=n*m;++i) {
pair<int,int> p=get(i);
int x=p.first;
int y=p.second;
int xx=(i-1)/m;
int yy=(i-1)%m;
if(x==xx&&y==yy) continue; string s0=getAns();
reset(0); if(x!=xx) swapRow(x,xx);
if(y!=yy) swapCol(y,yy); string s1=getAns();
if(s1<s0) reset(1); } return getAns(); }
};

  

2、(1)“()”是合法的字符串;(2)如果s是合法的,那么"(sss..ss)"是合法的,即1个或多个s外面加一层圆括号。给定字符串$S$以及 $k$,问$S$的所有合法子列的集合中(不重复),第$k$小的是哪个?$|S|<=150$,$k<=10^{9}$

思路:首先得到所有合法的字符串,然后分别枚举是不是$S$的子列。

#include <string.h>
#include <stdio.h>
#include <vector>
#include <string>
#include <set>
using namespace std; set<string> s; void dfs(string x) {
if(x.size()>150) return;
s.insert(x);
string p="";
for(int i=0;p.size()<=150;++i) {
p+=x;
dfs("("+p+")");
}
} class RepeatedStrings
{
public:
string findKth(string S,int k)
{
dfs("()");
for(string x:s) {
int p1=0,p2=0;
while(p1<(int)S.size()&&p2<(int)x.size()) {
if(S[p1]==x[p2]) ++p1,++p2;
else ++p1;
}
if(p2>=(int)x.size()) {
if(--k==0) return x;
}
}
return "";
}
};

  

topcoder srm 702 div1 -3的更多相关文章

  1. Topcoder SRM 643 Div1 250&lt&semi;peter&lowbar;pan&gt&semi;

    Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...

  2. Topcoder Srm 726 Div1 Hard

    Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...

  3. topcoder srm 714 div1

    problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...

  4. topcoder srm 738 div1 FindThePerfectTriangle&lpar;枚举&rpar;

    Problem Statement      You are given the ints perimeter and area. Your task is to find a triangle wi ...

  5. Topcoder SRM 602 div1题解

    打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...

  6. 【topcoder SRM 702 DIV 2 250】TestTaking

    Problem Statement Recently, Alice had to take a test. The test consisted of a sequence of true/false ...

  7. Topcoder SRM 627 div1 HappyLettersDiv1 &colon; 字符串

    Problem Statement      The Happy Letter game is played as follows: At the beginning, several players ...

  8. Topcoder SRM 584 DIV1 600

    思路太繁琐了 ,实在不想解释了 代码: #include<iostream> #include<cstdio> #include<string> #include& ...

  9. TopCoder SRM 605 DIV1

    604的题解还没有写出来呢.先上605的. 代码去practice房间找. 说思路. A: 贪心,对于每个类型的正值求和,如果没有正值就取最大值,按着求出的值排序,枚举选多少个类型. B: 很明显是d ...

随机推荐

  1. &period;net利用NPOI导入导出Excel

    NPOI在.net中的操作Excel 1.读取 using (FileStream stream = new FileStream(@"c:\客户资料.xls", FileMode ...

  2. Python 基礎 - bytes數據類型

    三元運算 什麼是三元運算?請看下圖說明 透過上圖說明後,可以得出一個三元運算公式: result = 值1 if 條件 else 值2, 如果鯈件為真: result = 值1 如果鯈件為假: res ...

  3. Firbird 将可 null 的列更新为 not null

    在GOOGLE上搜到2种方法:   第一种是新加一列 C2, 然后 update myTable set C2=原字段,再删除[原字段], 但这种方法有限制,当很多其它表引到此表时,非常麻烦.   第 ...

  4. dex

    数字交叉连接设备(Dendenkosha Electronic Exchange),就是常说的电子交换器.   数字交叉连接设备完成的主要是STM-N信号的交叉连接功能,它是一个多端口器件,它实际上相 ...

  5. OpenJudge 2773 2726 2727 采药

    1.链接地址: http://bailian.openjudge.cn/practice/2773/ http://bailian.openjudge.cn/practice/2726/ http:/ ...

  6. 【转】【C&sol;C&plus;&plus;】内存分配函数:malloc,calloc,realloc&comma;&lowbar;alloca

    转自:http://www.cnblogs.com/particle/archive/2012/09/01/2667034.html#commentform malloc: 原型:extern voi ...

  7. 键盘快速启动工具Launchy的简单使用技巧

    打开电脑面对林林总总的图标,找到对应的程序,快速启动显得尤为重要.这样有利于提高我们的效率. 好了,直接上图: 就是这款小巧的工具,界面如上. 接下来介绍这款工具的使用技巧. 1.安装成功后:打开工具 ...

  8. build配置项中maven常用插件

    <build> <!-- 在浏览器地址栏的项目名称 --> <finalName>${project.artifactId}</finalName> & ...

  9. holer实现外网访问本地网站

    外网访问本地网站 本地搭建了网站,只能在局域网内访问,怎样从公网也能访问内网网站? 本文将介绍使用holer实现的具体步骤. 1. 准备工作 1.1 安装并启动网站服务端 默认搭建的网站服务端端口是8 ...

  10. JavaScript有这几种测试分类

    译者按: 也许你讨厌测试,但是你不得不面对它,所以至少区分一下单元测试.集成测试与功能测试?对吧… 原文: What are Unit Testing, Integration Testing and ...