topcoder srm 705 div1 -3
1、设有一个字母表$T$,对于一个单词$w$,若对于任意的$0\leq i< |w|-1$,满足$w_{i}$在$T$中的排名小于等于$w_{i+1}$在$T$中的排名,则称$s$在$T$中是合法的。给出一个仅包含小写字母的单词集合$S$,重新排列字母表$T$得到新的字母表$T^{'}$,使得$S$中每个单词在$T^{'}$下是合法的。问是否存在这样的$T^{'}$。
思路:建立有向图。不存在环即可。可以拓扑排序或者用floyd判断。
import java.util.*;
import java.io.*; public class AlphabetOrderDiv1
{
int[][] g=new int[26][26]; public String isOrdered(String[] words)
{
for(int i=0;i<26;++i) g[i][i]=1;
for(int i=0;i<words.length;++i)
{
String s=words[i];
for(int j=0;j+1<s.length();++j)
{
int x=s.charAt(j)-'a';
int y=s.charAt(j+1)-'a';
g[x][y]=1;
}
}
for(int i=0;i<26;++i) {
for(int j=0;j<26;++j) {
for(int k=0;k<26;++k) {
g[j][k]|=g[j][i]&g[i][k];
}
}
} for(int i=0;i<26;++i) {
for(int j=0;j<i;++j) {
if(g[i][j]!=0&&g[j][i]!=0) return "Impossible";
}
}
return "Possible"; }
}
2、有n个盒子。每个盒子有1个糖。有一个大小为$n*m$转换矩阵$T$。进行$10^{100}$次操作,每次操作如下:(1)选择一个$j,0\leq j< m$,对所有的$i,0\leq i< n$,将第$i$个盒子的糖倒入到第$T[i][j]$个盒子。问最后最少有几个盒子中有糖?
思路:首先,每进行一次操作,有糖的盒子的数目不会变多。其次,假设一开始进行的操作序列为$S$,设这时候的状态为$x$,然后进行一个操作序列$P$,随后再进行一个操作序列$S$,设这时候的状态为$y$,那么$y$时有糖的盒子是状态$x$时有糖的盒子的子集。
基于这两个结果,操作的流程为:判断当前是否存在两个盒子,使得经过某个操作序列$P$后,这两个盒子在操作后合并到同一个盒子,那么就执行该操作序列$P$。直到不存在这样的两个盒子即可。
import java.util.*;
public class MovingTokens {
int[][] A;
int N,M;
int[][] B;
List<List<Integer>> T=new ArrayList<List<Integer>>();
int[][] f;
int K=0;
boolean dfs(int x,int y,LinkedList<Integer> path)
{
if(x==y) return true;
if(f[x][y]==K) return false;
f[x][y]=K;
for(int j=0;j<M;++j)
{
int xx=A[x][j];
int yy=A[y][j];
if(dfs(xx,yy,path)) {
path.addFirst(j);
return true;
}
}
return false;
}
int cal(int x,int y)
{
if(B[x][y]!=-2) return B[x][y];
++K;
LinkedList<Integer> path=new LinkedList<Integer>();
if(dfs(x,y,path)) {
T.add(path);
return B[x][y]=T.size()-1;
}
else {
return B[x][y]=-1;
}
}
void transform(int x,int y,int[] a)
{
int id=B[x][y];
int[] b=new int[N];
for(int cur=0;cur<T.get(id).size();++cur)
{
int j=T.get(id).get(cur);
for(int i=0;i<N;++i) {
b[i]=a[i];
a[i]=0;
}
for(int i=0;i<N;++i) a[A[i][j]]+=b[i];
}
}
public int move(int n, int m, int[] moves) {
A=new int[n][m];
for(int i=0;i<n;++i) {
for(int j=0;j<m;++j) {
A[i][j]=moves[j*n+i];
}
}
this.N=n;
this.M=m;
B=new int[N][N];
f=new int[N][N];
for(int i=0;i<N;++i) {
for(int j=i+1;j<N;++j) {
B[i][j]=-2;
}
}
int[] a=new int[N];
for(int i=0;i<N;++i) a[i]=1;
while(true)
{
int x=-1,y=-1;
all:
for(int i=0;i<N;++i) {
if(a[i]!=0) {
for(int j=i+1;j<N;++j) {
if(a[j]!=0&&cal(i,j)!=-1)
{
x=i;
y=j;
break all;
}
}
}
}
if(x==-1) break;
transform(x,y,a);
}
int cnt=0;
for(int i=0;i<N;++i) {
if(a[i]!=0) ++cnt;
}
return cnt;
}
}
topcoder srm 705 div1 -3的更多相关文章
- Topcoder SRM 643 Div1 250<peter_pan>
Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...
- Topcoder Srm 726 Div1 Hard
Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...
- topcoder srm 714 div1
problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...
- topcoder srm 738 div1 FindThePerfectTriangle(枚举)
Problem Statement You are given the ints perimeter and area. Your task is to find a triangle wi ...
- Topcoder SRM 602 div1题解
打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...
- Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串
Problem Statement The Happy Letter game is played as follows: At the beginning, several players ...
- Topcoder SRM 584 DIV1 600
思路太繁琐了 ,实在不想解释了 代码: #include<iostream> #include<cstdio> #include<string> #include& ...
- TopCoder SRM 605 DIV1
604的题解还没有写出来呢.先上605的. 代码去practice房间找. 说思路. A: 贪心,对于每个类型的正值求和,如果没有正值就取最大值,按着求出的值排序,枚举选多少个类型. B: 很明显是d ...
- topcoder srm 575 div1
problem1 link 如果$k$是先手必胜那么$f(k)=1$否则$f(k)=0$ 通过对前面小的数字的计算可以发现:(1)$f(2k+1)=0$,(2)$f(2^{2k+1})=0$,(3)其 ...
随机推荐
- bootstrap ui
附加访问地址:http://www.bootcss.com/p/jquery-ui-bootstrap/
- IE初始
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- Service Fabric本地开发部署修改数据目录
以修改5节点非安全模式为例: 在C:\Program Files\Microsoft SDKs\Service Fabric\ClusterSetup\NonSecure\FiveNode目录下,修改 ...
- 关于c语言中的program_invocation_short_name
错误源自用g++的交叉编译工具链编译eudev.经过一番查找,发现在 errno.h 这个头文件中有 program_invocation_short_name 的 extern 定义. 经过查看 e ...
- uvm设计分析——tlm
tlm模块,用来在不同模块之间实现实时通信,主要基于两个定义在通信双方的port类来实现. 两个port之间,通过connect函数,来拿到双方的class指针,进而调用对方的function. 但是 ...
- 阿里云ECS服务器 常见问题(1)
无法在外网访问服务器的公网ip 解决方法: 在阿里云 云服务器ECS-安全组规则 添加端口 可更根据阿里的教程来 配置完成后即可访问!
- 【转】基于Selenium的web自动化框架(python)
1 什么是selenium Selenium 是一个基于浏览器的自动化工具,它提供了一种跨平台.跨浏览器的端到端的web自动化解决方案.Selenium主要包括三部分:Selenium IDE.Sel ...
- Azure Messaging-ServiceBus Messaging消息队列技术系列2-编程SDK入门
各位,上一篇基本概念和架构中,我们介绍了Window Azure ServiceBus的消息队列技术的概览.接下来,我们进入编程模式和详细功能介绍模式,一点一点把ServiceBus技术研究出来. 本 ...
- 【Linux学习七】软件安装
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 一.编译安装1.解压 源码文件是压缩包 要先解压tar -zxvf t ...
- jsp无法访问
一直无法访问jsp: 由于Spring boot使用的内嵌的tomcat,而内嵌的tamcat是不支持jsp页面的,所有需要导入额外的包才能解决. <!-- 解决jsp无法访问 --> & ...