A:题目描述:
数字拆分:
一个数字有两种拆法,1 对所有数字减一 2 把所有数字都拆分成两个更小的数之和,问之多拆分n次,把N完全消去需要多少轮操作。
输入取值范围: 1<= N <=100, 0<=K<=100
样例: 输入 5 2 ,输出 4。 输入15 4,输出 6
定义dp[i][j]为将i之多拆分j次所有的轮数,dp[i][j] = min(dp[i-1][j-1], dp[(i+1)/2][j-1]) + 1 , dp[i-1][j] 代表这次不拆分,减去1, dp[(i+1)/2][j-1] 代表这次进行拆分,拆分成两个中位数,那么较大的数的所需操作肯定大于较小的中位数的所需的操作。
public class MaIn { public static void main(String[] args){ Scanner in = new Scanner(System.in); String[] input = in.nextLine().split(" "); int n, m; n = Integer.parseInt(input[0]); m = Integer.parseInt(input[1]); // dp[1][0~100]=1; if(m==0){ System.out.print(n); return; } int[][] dp = new int[105][105]; for(int i=0;i<=100;i++){ dp[i][0] = i; } for(int i=0;i<=100;i++){ dp[1][i] = 1; } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ dp[i][j]=Math.min(dp[i-1][j],dp[(i+1)/2][j-1])+1; } } System.out.print(dp[n][m]); } }
B:题目描述: 有n个村庄,每个村庄有A[i]个水果,A[i] >0 代表 村庄需要购进水果, A[i] < 0 代表村庄需要卖出水果。 所有村庄供需平衡,即A[i]求和为0,把k个水果搬到相邻村庄需要k块钱的运费,
最少需要多少花费可以满足所有村庄对水果的需求。
输入取值范围: 2 <= n <= 300000, -1000 <= A[i] <= 1000
考虑n个村庄和为0,那么不管前缀和为正或者负,它肯定需要在后面被加起来,那么每次都加上前缀和的绝对值,就代表了它需要被转移的代价。
输入 5 -4 1 -3 1 答案就为 5 + 1 + 2 +1 + 0 = 9
C: 题目描述: 对与长度为n的数组,做如下k次操作,找出数组中最小的数x,输出,所有数字减去x,如果数组中的数字全是0,直接输出0
思路: 先排序,再减去x,每次都会消去一个数字,做k次即可。