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)其 ...
随机推荐
- sql server 中DateName()函数及DatePart()函数
Datepart():返回代表指定日期的指定日期部分的整数 语法:Datepart(datepart,date) 返回类型:int DateName():返回代表指定日期的指定日期部分的字符串 语法 ...
- 一个获取本机ip地址的正则
ifconfig|grep -oP '(?<=inet addr:)(?=(?!127\.0\.0\.1))\d+(\.\d+){3}'
- caffe-ssd运行create_data.sh的时候报错:SSD from caffe.proto import caffe_pb2 ImportError: No module named caffe.proto
在用voc2007和voc2012的数据训练基于caffe的SSD模型的时候,我们需要将图片数据转换成lmdb格式,运行脚本文件是SSD源码里面提供的create_data.sh(具体位置在$CAFF ...
- 6.Daemon线程
1.如下代码: package com.bawei.multithread; public class Recursive { private static int counter = 0; publ ...
- CentOS下nginx+php的配置及nginx开机启动配置
关闭防火墙 (不然外链接是访问不了 apache) service iptables stop 关闭安全系统 SELinux( 不然报403 访问页面错误 ) 1.Nginx安装主要在于配置文件的修改 ...
- latex 公式 和排版
http://bbs.chinatex.org/forum.php?mod=viewthread&tid=7423 http://blog.sina.com.cn/s/blog_5e16f17 ...
- SQl server更新某阶段的匹配关系。
DECLARE @count INTEGERDECLARE @id INTEGERDECLARE @subjectID INTEGERSET @count=1SET @id =11894SET @su ...
- La Vie en rose (模拟)
#include<bits/stdc++.h> using namespace std; ; ; int T, n, m; char str1[maxm], str2[maxn]; int ...
- Azure Messaging-ServiceBus Messaging消息队列技术系列2-编程SDK入门
各位,上一篇基本概念和架构中,我们介绍了Window Azure ServiceBus的消息队列技术的概览.接下来,我们进入编程模式和详细功能介绍模式,一点一点把ServiceBus技术研究出来. 本 ...
- react系列笔记1 用npx npm命令创建react app
react系列笔记1 用npx npm命令创建react app create-react-app my-app是开始构建新的 React 单页应用程序的最佳方式.它已经为你设置好了开发环境,以便您可 ...