DS学习笔记coursera(3/6;1/6)

课程名称:Algorithmic Toolbox
课程内容:Data Structures and Algorithms
课程网址:https://www.coursera.org/learn/algorithmic-toolbox/home/week/1
课程进度:Week3

Week 3

Largest Number
Intriguing有趣的
Generalize概括
Descending下降的,递减的
Append附加,增补

Queue of patients
Queue(n.)队列,行列,队(v.)排队等候,排队
Iterate迭代
Subproblem子问题
Consistent与…一致的
Optimal最佳的,最优的
Minimum maximum
Consecutive连续的,连续不断的
Greedy Algorithm把问题拆分成小问题,根据局部最佳迭代到没有剩余,如果要证明就用反证法证明子问题没有更优解
Safe choice
Dilemma困境
Contradiction矛盾,对立

Implementation and Analysis
Permit(v.)允许,准许(n.)许可证
Simplicity(n.)简单,容易
Auxiliary辅助的,备用的
Infinity(n.)无穷
Complexity

Main Ingredients of Greedy Algorithm
核心思想过程1 Reduction to subproblem 2 Safe choice 3 general strategy
Slope斜度,斜坡

Celebration Party Problem
Supervise监督,管理,指导
Distribution分布,分配,分发
Vild有效的,合理的
Exponential指数的

Greedy Algorithm
Coordinate(n.)坐标(v.)搭配,协调
Corresponding相应的,相关的,符合的
Vet审查,仔细检查
Coincide(v.)重合,相符,相同,重叠

Implementation and Analysis
Append附加,增补
Segment段,部分,片
Abolish废除,废止
派对分组问题(按最大子集大小找最少子集)伪代码
在这里插入图片描述

Maximizing Loot
Fraction分数,小部分,小数
Restrain抑制,约束,控制
Intuitive直觉的,易懂的
Substitute取代,接替,替代

Implementation and Analysis

Review
在这里插入图片描述

Estimate估计
A choice is called safe if there is an optimal solution consistent with this first choice
Not all first choices are safe
Greedy choices are often unsafe
在这里插入图片描述

Denomination面额,面值
Overlap重叠,交叠
Vertical垂直的

CodeTests
在这里插入图片描述

#include

using namespace std;

int main()
{
int money;
cin >> money;
cout << money / 10 + money % 10 / 5 + money % 5;
return 0;
}
此题已AC。

在这里插入图片描述
在这里插入图片描述

#include
#include

using namespace std;

int compare(long double a,long double b)
{
if(a<b)
return 1;
else
return 0;
}
int main()
{
int n;
long double W;
cin >> n >> W;
long double num[n][2];
int i, j;
for(i=0;i<n;i++)
{
cin >> num[i][0] >> num[i][1];
}
long double sum = 0.00000000;
for (i = 0; i < n-1;i++)
{
for (j = i + 1;j<n;j++)
{
long double left = num[i][0] / num[i][1];
long double right = num[j][0] / num[j][1];
if (compare(left,right))
{
long long int temp1 = num[i][0];
long long int temp2 = num[i][1];
num[i][0] = num[j][0];
num[i][1] = num[j][1];
num[j][0] = temp1;
num[j][1] = temp2;
}
}
}
for (i = 0; i < n;i++)
{
if(W>0&&W>=num[i][1])
{
sum=sum+num[i][0];
W = W - num[i][1];
}
else if(W>0&&W<num[i][1])
{
sum = sum + W * num[i][0]/num[i][1]; //这里的计算方法可能会影响到精度
W = 0;
}
else if(W<=0)
{
break;
}

}
cout << setprecision(4)<< fixed<< sum << endl;
return 0;

}
此题AC。但是关于精确度的问题,经过反复尝试最终选择全long double而不是题中所给定的integer,主要问题可能集中在最后的sum求和的W上和数组本身的type上,如果有机会可以尝试修改各个变量type找出可行的最低限度。

在这里插入图片描述
在这里插入图片描述

#include

using namespace std;

int main()
{
int d, m, n;
int i, j;
cin >> d >> m >> n;
int stop[n+2];//最后决定采用N+2的大小那就一定要注意后续loop和相关操作
//边界是n+1?n+2?一定要对应上否则debug过程做不到控制变量太折磨了
stop[0] = 0;
for (i = 1; i < n+1; i++)
{
cin >> stop[i];
}
stop[n+1] = d;//n+1是最后一个元素了
int times = 0,temp=m;
for(i=1;i<n+2;i++)//边界是n+2
{//多重if-else应该可以优化
if(stop[i]-stop[i-1]<=0)
{
times=-1;
break;
}
else
{
if(stop[i]-stop[i-1]>m)
{
times=-1;
break;
}
else
{
if(stop[i]-stop[i-1]<=temp)
{
temp = temp - (stop[i] - stop[i - 1]);
}
else
{
temp = m;
times++;
temp = temp - (stop[i] - stop[i - 1]);
}
}
}
}
cout << times << endl;
return 0;
}
此题AC。一定要注意到如果为了题意定义了一个自己改变边界情况的数组,一定要做到整体代码全部考虑到这一改变带来的边界变化。做不到控制变量debug太折磨了。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值