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)其 ...
随机推荐
- 日线做多,15min做空的情况收集
- Spring框架第一天
## 今天课程:Spring框架第一天 ## ---------- **Spring框架的学习路线** 1. Spring第一天:Spring的IOC容器之XML的方式,Spring框架与Web项目整 ...
- es6正则表达式
es6中如果RegExp构造函数第一个参数是一个正则对象,那么可以使用第二个参数指定修饰符. 而且,返回的正则表达式会忽略原有的正则表达式的修饰符,只使用新指定的修饰符. new RegExp(/ab ...
- eclipse中tomcat启动成功,浏览器访问失败
eclipse添加tomcat之后,tomcat有个默认设置,我们需要对tomcat进行重新设置: 1.双击已添加的tomcat,进入到配置页面,找到server locations一栏,可以看到默认 ...
- nat123学习笔记
1.NAT123内网映射端口 在无内网路由管理员权限的情况下,需要将内网web应用暴露到公网访问,此时需要用到花生壳或者nat123(两个应用都不是免费的,其中花生壳可以8元认证,以后免费使用,nat ...
- Vue系列之 => 使用钩子函数的第二个参数传参
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- py3中reduce
前因 因为 Guido 先生讨厌 reduce.(Because Guido hates it. ) 详细过程请翻阅原文:http://www.artima.com/forums/flat.jsp?f ...
- superblock 区块数据读取
鸟哥私房菜笔记: 命令:df -Th Filesystem:代表该文件系统是在哪个 partition ,所以列出设备名称:1k-blocks:说明下面的数字单位是 1KB 呦!可利用 -h 或 -m ...
- rabbitmq的相关知识
1. 如何确保消息正确地发送至RabbitMQ? RabbitMQ使用发送方确认模式,确保消息正确地发送到RabbitMQ. 发送方确认模式:将信道设置成confirm模式(发送方确认模式),则所有在 ...
- mybatis源码解析8---执行mapper接口方法到执行mapper.xml的sql的过程
上一篇文章分析到mapper.xml中的sql标签对应的MappedStatement是如何初始化的,而之前也分析了Mapper接口是如何被加载的,那么问题来了,这两个是分别加载的到Configura ...