第十二周:
代码:、
leetcode:1014
/*
* 读题就知道显然是dp
* 首先定义一个性价比是A[i]-i
* 定义dp[i]是到i时前面最大的性价比
*
* 注意题目里的i和j有顺序要求,不然就会做错。。
* */
/*
然后本题 关系是只与上一项有关,可以空间优化
* */
public static int maxScoreSightseeingPair(int[] A) {
int len = A.length;//8,1,5,2,6
int[] dp=new int[len+1];
int res=0;
dp[0]=0;
for (int i = 1; i <= len; i++) {
int temp=A[i-1]-(i-1);
res=Math.max(res,temp+dp[i-1]);
dp[i]=Math.max(A[i-1]+(i-1),dp[i-1]);
}
return res;
}
1300:
/*
* 思路就是那个思路,为啥就是写出来会差点意思?
* */
public static int findBestValue(int[] arr, int target){
int len=arr.length;
int max=0,sum=0;
/*for (int i = 0; i < len; i++) {
if(max<arr[i])
max=arr[i];//找出最大值
sum+=arr[i];
}*/
for(int ch:arr){
sum+=ch;
if(max<ch){
max=ch;
}
}
if(sum<=target) return max;
//计算平均值
int aver=target/len;
while(true){
int next=getSum(arr,aver+1);
int curr=getSum(arr,aver);
if(target<next&&target>curr){
//下面这一步是比较两者谁的距离更小
if(target*2>next+curr) aver++;
break;
}else{
aver++;
}
}
return aver;
}
//小于value相加,大于就加value
public static int getSum(int[] arr,int value){
int sum=0;
for (int i = 0; i < arr.length; i++) {
if(arr[i]<value){
sum+=arr[i];
}else{
sum+=value;
}
}
return sum;
}
学习:看了《疯狂的java讲义》
做了《学生成绩管理系统》C语言课设