题目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. Docker学习笔记-Docker for Linux 安装

    前言: 环境:centos7.5 64 位 正文: Docker 软件包已经包括在默认的 CentOS-Extras 软件源里.因此想要安装 docker,只需要运行下面的 yum 命令: yum i ...

  2. springcloud开篇

    微服务作为现在的常用架构,已经到了不学不行的地步.君不见spring官网https://spring.io/已经将springboot,springcloud,spring cloud data fl ...

  3. Java 程序员必备的 15 个框架,前 3 个地位无可动摇!

    Java 程序员方向太多,且不说移动开发.大数据.区块链.人工智能这些,大部分 Java 程序员都是 Java Web/后端开发.那作为一名 Java Web 开发程序员必须需要熟悉哪些框架呢? 今天 ...

  4. 史上最全阿里 Java 面试题总结

    以下为大家整理了阿里巴巴史上最全的 Java 面试题,涉及大量 Java 面试知识点和相关试题. JAVA基础 JAVA中的几种基本数据类型是什么,各自占用多少字节. String类能被继承吗,为什么 ...

  5. 屌炸天,Oracle 发布了一个全栈虚拟机 GraalVM,支持 Python!

    前阵子,Oracle 发布了一个黑科技 "GraalVM",号称是一个全新的通用全栈虚拟机,并具有高性能.跨语言交互等逆天特性,真有这么神奇? GraalVM 简介 GraalVM ...

  6. Python编程Day6——元组类型、字典类型、集合

    一.元组类型(tuple) 1.用途:记录多个值,当多个值没有改变的需求此时元组更为合适 2.定义:在()内用逗号分隔开多个任意类型的值(参数为for可以循环的对象) 3.常用操作: 索引(正取向+反 ...

  7. MapReduce实现ReduceSideJoin操作

    本文转载于:http://blog.csdn.net/xyilu/article/details/8996204 一.准备两张表以及对应的数据 (1)m_ys_lab_jointest_a(以下简称表 ...

  8. murri

    github: https://github.com/haltu/muuri 官网:https://haltu.github.io/muuri/   安装 npm install murri —sav ...

  9. javaScript笔记详解(1)

    javaScript基础详解 版权声明 本文原创作者:雨点的名字 作者博客地址:https://home.cnblogs.com/u/qdhxhz/ 首先讲javaScript的摆放位置:<sc ...

  10. Android--通知之Notification

    前言 之前一篇博客讲了Android下使用Toast的方式提示消息.这篇博客讲解一下在Android中使用Notification提示消息给用户,Notification是一种具有全局效果的通知,程序 ...