1自动售货机有N瓶复制可乐。复制可乐非常神奇,喝了它的人会复制出一个自己来!现在有Alice,Bob,Cathy,Dave四个人在排队买复制可乐。买完的人会马上喝掉,然后他和他的副本会重新去队伍的最后面排队买可乐。问最后一个买到复制可乐的人叫什么名字?
public static void test5(){
Scanner in = new Scanner(System.in);
int n= in.nextInt();
int base=4;
int exp=1;
while(n>base*exp){
n=n-base*exp;
exp=exp*2;
}
int num=0;
for(int i=1;i<5;i++){
for(int j=1;j<exp+1;j++){
num=num+1;
if(num==n){
if(i==1)
System.out.println("Alice");
if(i==2)
System.out.println("Bob");
if(i==3)
System.out.println("Cathy");
if(i==4)
System.out.println("Dave");
}
}
}
}
2四年一度的世界杯又来了!小多在公司内发起了一个票选最强球星的活动。共有N个候选球星,每位投票者需要在选票上为每位候选球星评定一个实例等级,等级由英文字母表示,'a'级最高,'z'级最低,共26级。我们称候选球星X强于候选球星Y,当X的评级比Y高的票数高于Y的评级比X高的票数。若一个候选球星强于任一其他候选球星时,则称该球星为球王。根据这个规则,之多指挥有一个球王。需要注意的是也可能没有球王。现在给出所以后M张选票,请你帮小多判断以下哪位候选球星是球王。
输入描述:
第一行包含两个整数N、M,分别表示候选球星数量以及票选数量。
接下来有M行,每行是一个长度为N的字符串,每个字符串表示一张选票上的信息。每个字符串的第k(0<=k<N)个字符,表示这张选票对第k个候选球星的评级。
数据范围:1<=N<=50 1<=M<=50 字符串只包含小写英文字母
输出描述:
若有球王,则输出一行仅包含一个整数X,表示编号为X(0<=X<N)的候选球星为球王;若没有球王,则输出一行仅包含一个整数-1。
public static void test6(){
//输入第一行,读取n和m
Scanner in = new Scanner(System.in);
String s = in.nextLine();
String[] strs = s.split(" ");
int n = Integer.valueOf(strs[0]);
int m = Integer.valueOf(strs[1]);
//读取投票结果,存放在一个数组中,数组中存放的是选票上的信息
String[] str = new String[m];
for (int i = 0; i < m; i++)
str[i] = in.nextLine();
String[] new_str = new String[n];
for (int i = 0; i < n; i++) {
char[] c = new char[m];
for (int j = 0; j < m; j++) {
c[j] = str[j].charAt(i);
}
Arrays.sort(c);
new_str[i] = new String(c);
}
//使用比较字符串的大小,判断是否存在球星,如果有最大值且大于一个,则不存在球星。
int max = 0;
for (int i = 1; i < n; i++) {
if (new_str[max].compareTo(new_str[i]) > 0) {
max = i;
}
if (new_str[max].compareTo(new_str[i]) == 0) {
System.out.println("-1");
return;
}
}
System.out.println(max);
}
3运货物问题
N个货物分别重W1、W2、…Wn,(100<=W<=300),一辆车可以运重量300的货,问需要多少辆车。
public static void test8(){
Scanner in = new Scanner(System.in);
String str=in.nextLine();
String[] s= str.split(" ");
int w[]=new int[s.length];
for(int i=0;i<s.length;i++)
w[i]=Integer.valueOf(s[i]);
boolean mark[]=new boolean[s.length];
for(int i=0;i<s.length;i++)
mark[i]=false;
Arrays.sort(w);
int left=0,right=s.length-1,res=0;
while(right>=0&&w[right]>200){
res++;
right--;
}
//保存第一个<=200的元素下标
int nr = right;
while(right>0&&w[right]==200)
right--;
while(left<s.length&&w[left]==100)
left++;
while(left<right){
if(w[left]+w[right]<=300){
res++;
mark[left]=mark[right]=true;
left++;
right--;
}else{
right--;
}
}
right=nr;
left=0;
while(left<right){
if(mark[left]){
left++;
}else if(mark[right]){
right--;
}else if(left==right){
res++;
break;
}else if(w[right]==100){
int len=right-left+1;
res=res+len/3+(len%3>0?1:0);
break;
}else if(w[left]+w[right]<=300){
res++;
left++;
right--;
}else{
res++;
right--;
}
}
System.out.println(res);
}