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)其 ...
随机推荐
- ThreadLocal源码实现。
今天在FileInputStream源码中看到有ThreadLocal,之前一直没有理解过这个类,现在进行补充. ThreadLocal即为线程局部变量,它和同步机制处理的是不同的问题域,同步机制是为 ...
- CentOS下挂载数据盘
CentOS下挂载数据盘 1.显示磁盘使用情况:#df 2.显示磁盘:#fdisk -l 3.格式化分区:#mkfs.ext4 /dev/vdb1 //注:将/dev/vdb1格式 ...
- 记无法用被动方式登录远程linux主机的原因
[环境]: linux主机:华为企业云 ftp服务端:vsftpd 客户端:ftp命令行工具,安卓端ES文件浏览器 [现象]: 在ES文件浏览器中,使用被动方式没法连接,使用主动方式可以连接,但是没法 ...
- Git-什么是分支
为了理解什么是分支,我们先要回顾Git是如何存储数据的. Git并不会保存文件的差异值或者说变化量,而是直接保存文件的快照. 在Git中提交时,会保存一个commit对象,该对象包含一个指向暂存内容快 ...
- smtp常见问题
http://blog.csdn.net/chenfei_5201213/article/details/10138969
- uvalive 3276 The Great Wall Game
题意: 一个n * n的棋盘上放着n个棋子,现在要求把这n个棋子用最少的步数移到同一条直线上,即同一列同一行或者同一对角线(两条).输出最少的步数(只能往四个方向移动,即正东,正西,正南,正北). 思 ...
- 对象的copy
一般来讲,java中,对象的copy一般是通过Beans.copy(B, A);用来将A对象复制给B对象,包括对象里面的属性和值. 但但但...... 这样做,有一个很严重的问题,那就是:如果把A对象 ...
- 【Hadoop学习之二】Hadoop伪分布式安装
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 伪分布式就 ...
- ATM-JAVA程序 //程序有5处相同错误,找不出原因 转账功能没有实现,修改密码来不及实现了
package JCC;//信1705-3 20173681 靳晨晨import java.io.BufferedReader;import java.io.File;import java.io.F ...
- Linux基础命令---ifconfig
ifconfig ifconfig指令用来配置网络接口参数,同时还可以显示当前内核网络接口的工作状态.如果没有提供参数,则ifconfig将显示当前活动接口的状态.如果给定单个接口参数,则只显示给定接 ...