修理桌子
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);
}
}
}