蘑菇街笔试题总结

修理桌子
Arthur最近搬到了新的别墅,别墅特别大,原先的桌子显得比较小,所以他决定换一张新的桌子。他买了一张特别大的桌子,桌子是由很多条桌腿进行支撑的,可是回到家之后他发现桌子不稳,原来是桌子腿长度不太相同。他想要自己把桌子修理好,所以他决定移除掉一些桌腿来让桌子变得平稳。桌子腿总共有n条腿,第i条腿长度为li,Arthur移除第i桌腿要花费代价为di。假设k条腿桌子平稳的条件:超过一半桌腿能够达到桌腿长度的最大值。例如:一条腿的桌子是平稳的,两条腿的桌子腿一样长时是平稳的。请你帮Arthur计算一下是桌子变平稳的最小总代价。

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;

public class Main {

    public void sortNum(int[] l,int[] d,int begin,int end){

        int i=begin,j=end;
        int templ=l[begin],tempd=d[begin];
        while(i<j){
            while(i<j&&d[j]>=tempd) j--;
            if(i<j){
            l[i]=l[j]; d[i]=d[j];
            }
            while(i<j&&d[i]<=tempd) i++;
            if(i<j){
            l[j]=l[i]; d[j]=d[i];          
            }
        }
        l[i]=templ; d[i]=tempd;
        if(begin<i-1)
        sortNum(l,d,begin,i-1);
        if(end>i+1)
        sortNum(l,d,i+1,end);
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner scan=new Scanner(System.in);
        while(scan.hasNextInt()){
            int n=scan.nextInt();
            int[] l=new int[n];
            int[] d=new int[n];
            Set<Integer> set=new TreeSet<Integer>();
            Map<Integer,Integer> map=new HashMap<Integer,Integer>();
            int sum=0,count=0,min=0;
            for(int i=0;i<n;i++){
                l[i]=scan.nextInt();
                set.add(l[i]);
                if(map.get(l[i])==null) map.put(l[i],0);
                else map.put(l[i],map.get(l[i])+1);
            }          
            for(int i=0;i<n;i++){
                d[i]=scan.nextInt();
                sum+=d[i];
            }
            new Main().sortNum(l, d, 0, n-1);
            min=sum;
            for(int num:set){
                count=sum;
                int c=map.get(num)-1;
                for(int i=n-1;i>=0;i--){
                    if(l[i]==num) count=count-d[i];
                    if(c>=0&&l[i]<num){ count-=d[i]; c--;}
                }
                if(count<min) min=count;
            }
            System.out.println(min);
        }
    }

}

特殊交换
现有一个n个整数的序列,你要做的就是交换两个数的位置直到整个序列按照升序排列,那么将这个整数序列排好序,需要交换多少次?例如,1,2,3,5,4,我们只需要交换一次,即将5和4交换即可。

import java.util.Scanner;
public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner scan=new Scanner(System.in);
        int count=0;
        while(scan.hasNext()){
            int n=scan.nextInt();
            int[] l=new int[n];
            count=0;
            for(int i=0;i<n;i++){
                l[i]=scan.nextInt();
            }
            int j=0;
            for(int i=1;i<n;i++){
                j=i-1;
                while(j>=0&&l[j]>l[j+1]){
                    int temp=l[j];
                    l[j]=l[j+1];
                    l[j+1]=temp;
                    j--;
                    count++;
                }
            }
            System.out.println(count);
    }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值