两个搜狐的程序员加了一个月班,终于放假了,于是他们决定扎金花渡过愉快的假期 。游戏规则:共52张普通牌,牌面为2,3,4,5,6,7,8,9,10,J,Q,K,A之一,大小递增,各四张; 每人抓三张牌。两人比较手中三张牌大小,大的人获胜。 对于牌型的规则如下: 1.三张牌一样即为豹子 2.三张牌相连为顺子(A23不算顺子) 3.有且仅有两张牌一样为对子 豹子>顺子>对子>普通牌型 在牌型一样时,比较牌型数值大小(如AAA>KKK,QAK>534,QQ2>10104) 在二人均无特殊牌型时,依次比较三张牌中最大的。大的人获胜,如果最大的牌一样,则比较第二大,以此类推(如37K>89Q) 如二人牌面相同,则为平局。
java代码实现:略繁琐
import
java.util.Scanner;
import
java.util.HashMap;
import
java.util.Map;
public
class
Main{
public
static
void
main(String[] args){
Scanner sc=
new
Scanner(System.in);
while
(sc.hasNext()){
String str1=sc.next();
String str2=sc.next();
int
[] car1=
new
int
[
3
];
int
[] car2=
new
int
[
3
];
if
(!content(str1,car1) || !content(str2,car2)){System.out.println(-
2
);}
int
car_a=type(car1);
int
car_b=type(car2);
//不可能同时为相同的豹子
if
(car_a==car_b && car_a==
4
&& car1[
0
]==car2[
0
]){System.out.println(-
2
);}
//牌一样的情况
if
(car1[
0
]==car2[
0
] && car1[
1
]==car2[
1
] && car1[
2
]==car2[
2
]){
System.out.println(
0
);
}
//牌不一样
if
(car_a==car_b){
//都是豹子,比较大小
if
(car_a==
4
){
if
(car1[
0
]>car2[
0
]){
System.out.println(
1
);
}
else
{System.out.println(-
1
);}
}
//都是顺子
else
if
(car_a==
3
){
if
(car1[
2
] > car2[
2
]) {
System.out.println(
1
);
}
else
{
System.out.println(-
1
);
}
}
//都是对子
else
if
(car_a==
2
){
if
(car1[
1
]>car2[
1
]){
System.out.println(
1
);
}
else
{
System.out.println(-
1
);
}
}
//都是普通牌
else
{
if
(car1[
2
]>car2[
2
] ||
(car1[
2
]==car2[
2
] && car1[
1
]>car2[
1
]) ||
(car1[
2
]==car2[
2
] && car1[
1
]==car2[
1
] && car1[
0
]>car2[
0
])){
System.out.println(
1
);
}
else
{
System.out.println(-
1
);
}
}
}
else
{
//牌不一样
System.out.println(car_a>car_b?
1
:-
1
);
}
}
}
public
static
int
type(
int
[] car) {
//豹子:返回4
if
(car[
0
]==car[
1
] && car[
1
]==car[
2
]){
return
4
;
}
//顺子:返回3
if
(car[
0
]+
1
==car[
1
] && car[
1
]+
1
==car[
2
]){
return
3
;
}
//对子:返回2
if
(car[
0
]==car[
1
] || car[
1
]==car[
2
]){
return
2
;
}
//其他
return
1
;
}
private
static
boolean
content(String str,
int
[] car) {
Map map=
new
HashMap();
map.put(
'J'
,
11
);
map.put(
'Q'
,
12
);
map.put(
'K'
,
13
);
map.put(
'A'
,
14
);
int
i=
0
;
int
j=
0
;
char
[] c=str.toCharArray();
while
(i
if
(map.containsKey(c[i])){
car[j]=map.get(c[i]);
}
else
if
(c[i]>=
'2'
&& c[i] <=
'9'
){
car[j]=c[i]-
'0'
;
}
else
if
(c[i]==
'1'
&& c[i+
1
]==
'0'
){
car[j]=
10
;
i++;
}
else
{
return
false
;}
i++;
j++;
}
if
(car.length!=
3
){
return
false
;}
car=sort(car);
return
true
;
}
public
static
int
[] sort(
int
[] car) {
for
(
int
i=
0
;i<
3
;i++){
for
(
int
j=i;j<
3
;j++){
if
(car[i]>car[j]){
int
t=car[i];
car[i]=car[j];
car[j]=t;
}
}
}
return
car;
}
}
搜狐员工小王最近利用假期在外地旅游,在某个小镇碰到一个马戏团表演,精彩的表演结束后发现团长正和大伙在帐篷前激烈讨论,小王打听了下了解到, 马戏团正打算出一个新节目“最高罗汉塔”,即马戏团员叠罗汉表演。考虑到安全因素,要求叠罗汉过程中,站在某个人肩上的人应该既比自己矮又比自己瘦,或相等。 团长想要本次节目中的罗汉塔叠的最高,由于人数众多,正在头疼如何安排人员的问题。小王觉得这个问题很简单,于是统计了参与最高罗汉塔表演的所有团员的身高体重,并且很快找到叠最高罗汉塔的人员序列。 现在你手上也拿到了这样一份身高体重表,请找出可以叠出的最高罗汉塔的高度,这份表中马戏团员依次编号为1到N。
输入描述:
首先一个正整数N,表示人员个数。 之后N行,每行三个数,分别对应马戏团员编号,体重和身高。
输出描述:
正整数m,表示罗汉塔的高度。
输入例子:
6
1 65 100
2 75 80
3 80 100
4 60 95
5 82 101
6 81 70
输出例子:
4
解题思路;
和上面的最长递增子序列算法原型相同,只是增加了对体重的排序。
package com.chen.souhu;
import java.util.Scanner;
public class Main {
static class Person {
int num;
int high;
int weight;
int dp;//表示已该人为第一个罗汉的情况下,可以叠几个。
int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public int getHigh() {
return high;
}
public void setHigh(int high) {
this.high = high;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public int getDp() {
return dp;
}
public void setDp(int dp) {
this.dp = dp;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt();
Person map[] = new Person[n];
for (int i = 0; i < n; i++) {
map[i] = new Person();
map[i].setNum(sc.nextInt());
map[i].setWeight(sc.nextInt());
map[i].setHigh(sc.nextInt());
}
sort(map);
int maxH = getRes(map, n);
System.out.println(maxH);
}
}
public static void sort(Person[] map){
// 根据体重排序
for (int i = 0; i < map.length; i++) {
for (int j = i; j > 0; j--) {
if (map[j].getWeight() < map[j - 1].getWeight()) {
Person p=map[j];
map[j]=map[j-1];
map[j-1]=p;
}
// 如果体重相同,身高矮的在后面
else if (map[j].getWeight() == map[j - 1].getWeight()
&& map[j].getHigh() > map[j - 1].getHigh()) {
Person p=map[j];
map[j]=map[j-1];
map[j-1]=p;
} else {
break;
}
}
}
}
//根据体重排序,然后根据身高求dp
public static int getRes(Person[] map, int n) {
int dp = 0;
for (int i = 0; i < n; i++) {
map[i].setDp(1);
for (int j = 0; j < i; j++) {
if (map[i].getHigh() >= map[j].getHigh() && map[i].getDp() < map[j].getDp() + 1) {
map[i].setDp(map[j].getDp() + 1);
}
}
dp = Math.max(dp, map[i].getDp());
}
return dp;
}
}
狐进行了一次黑客马拉松大赛,全公司一共分为了N个组,每组一个房间排成一排开始比赛,比赛结束后没有公布成绩,但是每个组能够看到自己相邻的两个组里比自己成绩低的组的成绩,比赛结束之后要发奖金,以1w为单位,每个组都至少会发1w的奖金,另外,如果一个组发现自己的奖金没有高于比自己成绩低的组发的奖金,就会不满意,作为比赛的组织方,根据成绩计算出至少需要发多少奖金才能让所有的组满意。
输入描述:
每组数据先输入N,然后N行输入N个正整数,每个数表示每个组的比赛成绩。
输出描述:
输出至少需要多少w的奖金
输入例子:
1020 32 12 32 45 11 21 31 41 33
输出例子:
20
import
java.util.Scanner;
public
class
Main{
public
static
void
main(String[] args){
Scanner sc=
new
Scanner(System.in);
while
(sc.hasNext()){
int
n=sc.nextInt();
if
(n<=
0
){System.out.println(
0
);}
int
[] a=
new
int
[n];
for
(
int
i=
0
;i
a[i]=sc.nextInt();
}
System.out.println(getRes(n,a));
}
}
private
static
int
getRes(
int
n,
int
[] a) {
if
(n<=
0
){
return
0
;}
if
(a.length!=n){
return
0
;}
int
[] res=
new
int
[n];
int
i=
1
;
int
j=n-
2
;
while
(i
if
(a[i] > a[i -
1
]){
res[i] = res[i -
1
] +
1
;
}
i++;
}
while
(j >=
0
) {
if
(a[j] > a[j+
1
] && res[j]
1
]+
1
){
res[j] = res[j+
1
] +
1
;
}
j--;
}
int
count=
0
;
for
(
int
k=
0
;k
count+=res[k];
}
return
count+n;
}
}