题目1 : 字符串排序

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

一般我们在对字符串排序时,都会按照字典序排序。当字符串只包含小写字母时,相当于按字母表"abcdefghijklmnopqrstuvwxyz"的顺序排序。

现在我们打乱字母表的顺序,得到一个26个字母的新顺序。例如"bdceafghijklmnopqrstuvwxyz"代表'b'排在'd'前,'d'在'c'前,'c'在'e'前……

给定N个字符串,请你按照新的字母顺序对它们排序。

输入

第一行包含一个整数N。(1 <= N <= 1000)

第二行包含26个字母,代表新的顺序。

以下N行每行一个字符串S。 (|S| <= 100)

输出

按新的顺序输出N个字符串,每个字符串一行。

样例输入
5
bdceafghijklmnopqrstuvwxyz
abcde
adc
cda
cad
ddc
样例输出
ddc
cda
cad
abcde
adc
 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; int ord[]; struct Node{
string str;
bool operator<(Node x) const{
int len1 = str.length();
int len2 = x.str.length();
for(int i = ; i < len1 && i < len2; i++){
if(str[i] == x.str[i])continue;
return ord[str[i]-'a'] < ord[x.str[i]-'a'];
}
if(len1 < len2)return true;
else return false;
}
}node[]; int main()
{
int n;
string str;
while(cin>>n){
cin>>str;
for(int i = ; i < ; i++){
ord[str[i]-'a'] = i;
}
for(int i = ; i < n; i++){
cin>>node[i].str;
}
sort(node, node+n);
for(int i = ; i < n; i++)
cout<<node[i].str<<endl;
} return ;
}
 import java.util.Arrays;
import java.util.Scanner; public class Main { public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n;
String str;
while(cin.hasNext()) {
n = cin.nextInt();
str = cin.next();
Node.calOrd(str);
Node[] nodes = new Node[n];
for(int i = 0; i < n; i++) {
String ss = cin.next();
nodes[i] = new Node(ss);
}
Arrays.sort(nodes);
for(Node node: nodes) {
System.out.println(node.sb.toString());
}
}
}
} class Node implements Comparable<Node>{
static int[] ord = new int[26];
public String sb; Node(String _str) {
this.sb = _str;
} static public void calOrd(String str) {
for(int i = 0; i < 26; i++) {
ord[str.charAt(i)-'a'] = i;
}
} public void setSb(String _sb) {
this.sb = _sb;
} public int compareTo(Node x) {
int len1 = sb.length();
int len2 = x.sb.length();
for(int i = 0; i < len1 && i < len2; i++) {
if(sb.charAt(i) == x.sb.charAt(i))continue;
return ord[sb.charAt(i)-'a'] < ord[x.sb.charAt(i)-'a'] ? -1 : 1;
}
if(len1 < len2)return -1;
else return 1;
}
}

Java

题目2 : 亮灯方案

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

NxM盏灯组成了一个N行M列的矩阵,其中有些(至少一盏)灯是亮的,有些(至少一盏)是灭的。

现在小Hi希望点亮全部的灯。他每次可以选择一盏熄灭的灯点亮,前提是这盏灯与至少一盏亮的灯相邻(上下左右四个方向)。

请你计算小Hi一共有多少种不同的点亮顺序。

输入

第一行包含两个整数N和M。(1 <= N * M <= 20)

以下N行M列是一个01矩阵,0代表灭,1代表亮。

输出

一个整数代表答案

样例输入
2 2
10
00
样例输出
4
 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <map> using namespace std; const int dx[] = {, , , -};
const int dy[] = {, , -, };
map<string, long long> dp;
string M[];
int n, m; bool isOK(int x, int y){
for(int i = ; i < ; i++){
int nx = x + dx[i];
int ny = y + dy[i];
if(nx < || nx >= n || ny < || ny >= m)
continue;
if(M[nx][ny] == '')return true;
}
return false;
} string toString(){
string str(n*m, '');
for(int i = ; i < n; i++)
for(int j = ; j < m; j++)
str[i*m+j] = M[i][j];
return str;
} long long dfs(int mie){
if(mie == )return ;
if(dp[toString()] != )return dp[toString()];
dp[toString()] = ;
long long sum = ;
for(int i = ; i < n; i++){
for(int j = ; j < m; j++){
if(M[i][j] == '' && isOK(i, j)){
M[i][j] = '';
sum += dfs(mie-);
M[i][j] = '';
}
}
}
return dp[toString()] = sum;
} int main()
{
while(cin>>n>>m){
int mie = ;
dp.clear();
for(int i = ; i < n; i++){
cin>>M[i];
for(int j = ; j < m; j++){
if(M[i][j] == '')mie++;
}
}
cout<<dfs(mie)<<endl;
} return ;
}
 import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner; public class Main {
static int[] dx = {0, 1, 0, -1};
static int[] dy = {1, 0, -1, 0};
static StringBuilder[] M = new StringBuilder[20];
static int n, m;
static Map<String, Long> dp = new HashMap<String, Long>(); static String MtoString() {
StringBuilder sb = new StringBuilder("");
for(int i = 0; i < n; i++) {
sb.append(M[i]);
}
return sb.toString();
} static boolean isOK(int x, int y) {
for(int i = 0; i < 4; i++){
int nx = x + dx[i];
int ny = y + dy[i];
if(nx < 0 || nx >= n || ny < 0 || ny >= m)
continue;
if(M[nx].charAt(ny) == '1')return true;
}
return false;
} static long dfs(int mie) {
if(mie == 1)return 1;
if(dp.get(MtoString()) != null)return dp.get(MtoString());
long sum = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(M[i].charAt(j) == '0' && isOK(i, j)){
M[i].setCharAt(j, '1');
sum += dfs(mie-1);
M[i].setCharAt(j, '0');
}
}
}
dp.put(MtoString(), sum);
return sum;
} public static void main(String[] args) {
Scanner cin = new Scanner(System.in); int mie;
while(cin.hasNext()) {
dp.clear();
n = cin.nextInt();
m = cin.nextInt();
mie = 0;
for(int i = 0; i < n; i++) {
M[i] = new StringBuilder(cin.next());
for(int j = 0; j < m; j++)
if(M[i].charAt(j) == '0')
mie++;
}
System.out.println(dfs(mie));
}
}
}

Java

题目3 : 部门聚会

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

小Hi在Hihoole公司的实习期结束了。在回学校前,他决定请部门所有同事来住所聚会。

已知小Hi一共有N名同事,编号1~N,其中第i名同事的酒量是Ai。

这N名同事的上下级关系恰好组成一棵树型结构。对于第i名同事来说,如果他的直接上级没有出席聚会,他会喝掉Ai单位的酒;如果他的直接上级出席了聚会,他会有所收敛,只喝掉Ai/2单位的酒。

小Hi想知道,自己至少要准备多少单位的酒,才能保证无论哪些人出席聚会,酒都够喝。

输入

第一行包含一个整数N。(1 <= N <= 100000)

第二行包含N个整数,A1, A2, ... AN。(0 <= Ai <= 100000)

以下N-1行每行包含两个整数u和v,代表u是v的直接上级。

输出

小Hi至少需要准备的酒量,保留1位小数。

样例输入
5
5 2 4 1 4
2 4
2 1
1 5
1 3
样例输出
10.5
 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector> using namespace std; const int N = ; double dp[N][];
int arr[N], fa[N];
vector<int> vec[N]; void dfs(int rt){
int len = vec[rt].size();
dp[rt][] = arr[rt]*1.0;
for(int i = ; i < len; i++)
dfs(vec[rt][i]);
for(int i = ; i < len; i++){
dp[rt][] += max(dp[vec[rt][i]][], dp[vec[rt][i]][]);
dp[rt][] += max(dp[vec[rt][i]][] - 0.5*arr[vec[rt][i]], dp[vec[rt][i]][]);
}
} int main()
{
int n;
while(cin>>n){
memset(dp, , sizeof(dp));
for(int i = ; i <= n; i++){
cin>>arr[i];
fa[i] = -;
vec[i].clear();
}
int u, v;
for(int i = ; i < n-; i++){
cin>>u>>v;
fa[v] = u;
vec[u].push_back(v);
}
int root = ;
while(fa[root] != -)root = fa[root];
dfs(root);
printf("%.1f\n", max(dp[root][],dp[root][]));
} return ;
}
 import java.util.*;

 public class Main {
static final int N = 100005;
static double[][] dp = new double[N][2];
static int [] arr = new int[N];
static int [] fa = new int[N];
static Vector<Integer> [] vec = new Vector[N]; static void dfs(int rt) {
int len = vec[rt].size();
dp[rt][1] = arr[rt];
for(int v: vec[rt]) {
dfs(v);
}
for(int v: vec[rt]) {
dp[rt][0] += Math.max(dp[v][0], dp[v][1]);
dp[rt][1] += Math.max(dp[v][1]-0.5*arr[v], dp[v][0]);
}
} public static void main(String[] args) {
Scanner cin = new Scanner(System.in); int n;
while(cin.hasNext()) {
n = cin.nextInt();
for(int i = 1; i <= n; i++) {
dp[i][0] = dp[i][1] = 0;
arr[i] = cin.nextInt();
fa[i] = -1;
vec[i] = new Vector<Integer>();
}
int u, v;
for(int i = 0; i < n-1; i++) {
u = cin.nextInt();
v = cin.nextInt();
fa[v] = u;
vec[u].add(v);
}
int root = 1;
while(fa[root] != -1)root = fa[root];
dfs(root);
System.out.printf("%.1f\n", Math.max(dp[root][0], dp[root][1]));
}
}
}

Java

hihoCoder编程练习赛52的更多相关文章

  1. hihocoder [Offer收割]编程练习赛52 D 部门聚会

    看了题目的讨论才会做的 首先一点,算每条边(u, v)对于n*(n+1)/2种[l, r]组合的贡献 正着算不如反着算 哪些[l, r]的组合没有包含这条边(u, v)呢 这个很好算 只需要统计u这半 ...

  2. hihocoder 编程练习赛23

    第一题:H国的身份证号码I 题意:一个N位的正整数(首位不能是0).每位数字都小于等于K,并且任意相邻两位数字的乘积也小于等于K.按从小到大的顺序输出所有合法的N位号码,每个号码占一行. 思路:dfs ...

  3. hihocoder编程练习赛75

    题目1 : 工作城市分配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 H公司在北京和上海两个城市各有一间办公室.该公司最近新招募了2N名员工,小Hi负责把这2N名员工 ...

  4. hihoCoder编程练习赛72

    题目1 : 玩具设计师 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho作为Z国知名玩具品牌AKIRE的首席设计师,对玩具零件的挑剔程度已经到了叹为观止的地步.所有 ...

  5. hihoCoder编程练习赛70

    题目1 : 数位翻转 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 n,你可以进行若干次操作,每次操作可以翻转 n 的二进制表示下的某一位,即将 0 变成 ...

  6. hihoCoder编程练习赛69

    题目1 : 偶数长度回文子串 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个小写字母字符串,请判断它是否有长度为偶数的非空连续回文子串 输入 输入包含多组数据. ...

  7. hihoCoder编程练习赛67

    题目1 : 序列 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 给定两个正整数 n, P,求满足以下两个条件的长度为 n 的序列 ai 个数: 1. 1 ≤ ai ≤ ...

  8. hihoCoder编程练习赛49

    题目1 : 相似颜色 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在CSS中我们可以用井号(#)加6位十六进制数表示一种颜色,例如#000000是黑色,#ff0000 ...

  9. hihocoder编程练习赛91:相邻字符串

    题目链接 给定一个长度小于1e5的字符串s,s中字符全是大写英语字母.现在要寻找s中有多少组邻近的"hio"字符串,邻近的定义如下:hi距离+io距离+ho距离小于k.输入k和s, ...

随机推荐

  1. 探秘JS的异步单线程

    对于通常的developer(特别是那些具备并行计算/多线程背景知识的developer)来讲,js的异步处理着实称得上诡异.而这个诡异从结果上讲,是由js的“单线程”这个特性所导致的. 我曾尝试用“ ...

  2. maven安装和四大特性

    一.安装配置maven 官网下载:http://maven.apache.org/download.html 1:解压后放在一个固定的位置 2:配置环境变量,具体如下 新建系统环境变量:MAVEN_H ...

  3. Git使用详细教程(4):git rm使用详解

    我们使用git rm 文件名来进行删除文件的操作. git rm index.php这个命令把工作区的index.php删除并暂存了. 如何撤回已暂存的删除命令? 上图中已经给出了提示,使用git r ...

  4. PHPExcel防止大数以科学计数法显示

    在使用PHPExcel来进行数据导出时,常常需要防止有些数字(如手机号.身份证号)以科学计数法显示,我们可以采用下面的方式来解决: setCellValueExplicit第三个参数用PHPExcel ...

  5. docker 简单介绍及基础命令运用

    一.什么是docker? Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. 简单的来讲Docker实际上就是一个大型容器.容器是完全使用沙箱机制,相互之间不 ...

  6. 利用 ELK 搭建 Docker 容器化应用日志中心

    利用 ELK 搭建 Docker 容器化应用日志中心 概述 应用一旦容器化以后,需要考虑的就是如何采集位于 Docker 容器中的应用程序的打印日志供运维分析.典型的比如SpringBoot应用的日志 ...

  7. IDEA中MAVEN项目有多个子目录,如何加载构建

    ddts这个项目有三个子目录,每个子目录下面也都有一个 pom.xml       此时需要 右键子目录的 pom.xml,选择Add as Maven Project,在上图中cli.core两个目 ...

  8. Java线程之 InterruptedException 异常

    Java线程之 InterruptedException 异常   当一个方法后面声明可能会抛出InterruptedException 异常时,说明该方法是可能会花一点时间,但是可以取消的方法. 抛 ...

  9. 上传文件报错--Unable to find 'struts.multipart.saveDir' property setting.

    struts2 上传文件时,有时候会报这个错误. Unable to find 'struts.multipart.saveDir' property setting. Defaulting to j ...

  10. 【WebApi系列】浅谈HTTP在WebApi开发中的运用

    WebApi系列文章 [01]浅谈HTTP在WebApi开发中的运用 [02]聊聊WebApi体系结构 [03]详解WebApi参数的传递 [04]详解WebApi测试和PostMan [05]浅谈W ...