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)其 ...
随机推荐
- 工厂模式&策略模式。
抽象.封装,具体事情做得越多,越容易犯错误.这每个做过具体工作的人都深有体会,相反,官做得越高,说出的话越抽象越笼统,犯错误可能性就越少.好象我们从编程序中也能悟出人生道理.(百度百科) 不断抽象封装 ...
- 用C#创建一个窗体,在构造函数里面写代码和在from_load事件里面写代码有什么不同?
没太大区别.一区别就是代码加载时间先后的问题.构造函数先加载,load事件中后加载.
- field_automation源码分析
field_automation主要通过uvm_field_utils_begin和uvm_field_utils_end来加到自己写的class中. uvm_field_utils_begin,在o ...
- 【转】通过Excel生成批量SQL语句,处理大量数据
经常会遇到这样的要求:用户给发过来一些数据,要我们直接给存放到数据库里面,有的是Insert,有的是Update等等,少量的数据我们可以采取最原始的办法,也就是在SQL里面用Insert into来实 ...
- Python - 2. Built-in Collection Data Types
From: http://interactivepython.org/courselib/static/pythonds/Introduction/GettingStartedwithData.htm ...
- .net 缓存
缓存有很多实现方法,所有这些可以被分为两类,基于内存的缓存和基于磁盘的缓存: 1. 内存驻留缓存——包含在内存中临时存储数据的所有实现方法,通常在以下情况下使用: a) 应用程序频繁使用 ...
- Linux基础命令---ifcfg
ifcfg ifcfg是一个简单的脚本替换iconfig命令,它可以设置网络接口的ip地址. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedo ...
- 【JavaScript 6连载】五、继承的概念
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- バイナリハックイージー / Unhappy Hacking (ABC Edit) (stack)
题目链接:http://abc043.contest.atcoder.jp/tasks/abc043_b Time limit : 2sec / Memory limit : 256MB Score ...
- Deprecated: getEntityManager is deprecated since Symfony 2.1
PHP5.3应用中,登陆后台管理时提示错误: Deprecated: getEntityManager is deprecated since Symfony 2.1. Use getManager ...