蘑菇街笔试题总结

来源:互联网 发布:电脑桌面课程表软件 编辑:程序博客网 时间:2024/04/29 23:10

修理桌子
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
原创粉丝点击