A. Chips Moving
题目:+2和-2的花费为0,+1和-1的花费为1,求最小花费使得n个数的值都一样大
思路:求偶数和奇数的最小数,奇数偶数都可以通过操作2变为相同
input
3 1 2 3
output
1
input
5 2 2 2 3 3
output
2
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import java.util.Scanner; 2 public class Main { 3 public static void main(String args[]) 4 { 5 Scanner sc=new Scanner(System.in); 6 int n=sc.nextInt(); 7 int A=0,B=0; 8 for(int i=0;i<n;i++) 9 { 10 int a=sc.nextInt(); 11 if(a%2==1) 12 { 13 A++; 14 } 15 else 16 B++; 17 } 18 System.out.println(Math.min(A, B)); 19 20 } 21 22 }
B. Bad Prices
思路:倒过来维护最小值
input
5 6 3 9 4 6 7 5 1 1000000 2 2 1 10 31 41 59 26 53 58 97 93 23 84 7 3 2 1 2 3 4 5
output
3 0 1 8 2
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import java.util.Scanner; 2 3 public class Main { 4 public static void main(String args[]) 5 { 6 Scanner sc=new Scanner(System.in); 7 int T=sc.nextInt(); 8 while(T--!=0) 9 { 10 int n=sc.nextInt(); 11 int str[]=new int[n]; 12 for(int i=0;i<n;i++) 13 str[i]=sc.nextInt(); 14 int sum=0; 15 int min=str[n-1]; 16 for(int i=n-2;i>=0;i--) 17 { 18 if(str[i]>=min) 19 sum++; 20 else 21 min=str[i]; 22 } 23 System.out.println(sum); 24 } 25 } 26 27 }
C. Book Reading
题目:输入n页书按m页分页,如n=15,m=5,可分到5,10,15。求最后一位的和=5+0+5=10
思路:m=3可分3,6,9,12,15,18,21,24,27,30,33,36.。。。。 10位一循环
m=17可分17,34,51,68,85,102,119,136,153,170,187,204,221.。。。。10位一循环
m=4可分4,8,12,16,20,24,28.。。。。5位一循环
m=12可分12,24,36,48,60,72,84,96.。。5位一循环
m=5二位一循环
m=0输出0
m%10为偶数的话,5一循环,奇数10一循环,特判0,5
input
7 1 1 10 1 100 3 1024 14 998244353 1337 123 144 1234312817382646 13
output
1 45 153 294 3359835 0 427262129093995
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import java.util.Scanner; 2 3 public class Main { 4 public static void main(String args[]) { 5 Scanner sc=new Scanner(System.in); 6 int T=sc.nextInt(); 7 while(T--!=0) 8 { 9 long n=sc.nextLong(),m=sc.nextLong(); 10 long ans=0; 11 if(m%10==0) 12 ans=0; 13 else if(m%10==5) 14 { 15 long num=n/m; //这里是除以m,不是m%10,wa了3次 16 ans+=num/2*5; 17 if(num%2!=0) 18 { 19 ans+=5; 20 } 21 } 22 else if(m%10%2==1) 23 { 24 int x=(int) (m%10); 25 int str[]=new int[11]; 26 for(int i=1;i<=10;i++) 27 { 28 str[i]=x*i%10+str[i-1]; 29 30 } 31 long num=n/m; 32 ans+=num/10*str[10]; 33 if(num%10!=0) 34 { 35 ans+=str[(int) (num%10)]; 36 } 37 } 38 else 39 { 40 int x=(int) (m%10); 41 int str[]=new int[6]; 42 for(int i=1;i<=5;i++) 43 { 44 str[i]=x*i%10+str[i-1]; 45 46 } 47 long num=n/m; 48 ans+=num/5*str[5]; 49 if(num%5!=0) 50 { 51 ans+=str[(int) (num%5)]; 52 } 53 } 54 System.out.println(ans); 55 } 56 } 57 58 }
D1. Equalizing by Division (D2可以过,改成c++)
题意:n个数,每次可以任选一个数使它变为原来的一半,求最小操作数使得至少有k个数相等
思路:把n排序从小到大遍历n个数,将每个数一直缩小2倍直到0,用sum【】记录数字出现的个数,>=k时更新,每次处理用cost【】记录是第几次变过来的。
input
5 3 1 2 2 4 5
output
1
input
5 3 1 2 3 4 5
output
2
input
5 3 1 2 3 3 3
output
0
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package The582; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStreamReader; 6 import java.io.StreamTokenizer; 7 import java.util.Arrays; 8 import java.util.Scanner; 9 10 public class MainD1 { 11 public static void main(String args[]) throws IOException 12 { 13 StreamTokenizer sc=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); 14 int n,k; 15 sc.nextToken(); 16 n=(int) sc.nval; 17 sc.nextToken(); 18 k=(int) sc.nval; 19 int str[]=new int[n],ans=Integer.MAX_VALUE; 20 for(int i=0;i<n;i++) 21 { 22 sc.nextToken(); 23 str[i]=(int) sc.nval; 24 } 25 Arrays.sort(str); 26 int cost[]=new int[200005],sum[]=new int[200005]; 27 for(int i=0;i<n;i++) 28 { 29 int temp=str[i],j=1; 30 while(temp>0) 31 { 32 sum[temp]++; 33 if(sum[temp]==k) 34 ans=Math.min(ans, cost[temp]);//System.out.println(cost[temp/2]+" "+cost[temp]+" "+i+" "+temp); 35 cost[temp/2]+=j++;//System.out.println(cost[temp/2]+" "+cost[temp]); 36 temp/=2; 37 } 38 } 39 System.out.println(ans); 40 } 41 42 }