B - Collecting Packages(19:38)
题目大意:
题目给你n个点的坐标,起点为0,0并且只能向右和向上移动,问你能不能遍历完所有这n个点,可以的话输出最少操作的操作顺序,并且要求尽量先向右再向上,不可以的话say no
思路:
- 模拟,因为只能向右,那么只能存在楼梯状的路线,那么按照x轴排序后如果对应的y轴不是递增数列就输出NO,否则就一直R到下一个点所在的x坐标再U到该x坐标下最远的点,依此类推。这样的话时间复杂度主要是一次读数据一次排序加一次扫数据的复杂度
- (20:25)AC了此题,有一个疑惑:这样的cmp是按“返回1表示正确顺序”的原则,那么到底是“返回1表示需要换顺序”还是“返回1表示正确顺序”呢?
bool cmp(E x,E y){
//先按横坐标从小到大排,再按纵坐标从小到大
return x.a==y.a ? x.b<y.b : x.a<y.a;
}
前天的代码:
//返回true的时候表示要换位置
bool cmp(const b &a,const b &b){
//按区间和sum排,大的在前 小的在后
if(a.sum!=b.sum){
return a.sum<b.sum;
}
//如果两个sum相等但右端点不相等,按右端点大的在前
else if(a.r!=b.r){
return a.r<b.r;
}
//如果俩sum相等且右端点相等,按区间长度大的在前面
else {
return (a.r-a.l)<(b.r-b.l);
}
}
总结:刚试了一下,返回1表示正确顺序是没有错的:
int cmp(int a,int b){
return a < b;
}
int main(){
int a[10]={1,5,8,1,6,45,84,99,55,2};
sort(a,a+10,cmp);
for(int i=0;i<10;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
输出1 1 2 5 6 8 45 55 84 99
C - Product of Three Numbers(20:38)
题目大意:
给你一个数,让你分解成三个不相同数的乘积,并且这三个数都大于等于二
思路:
- 先判断是偶数还奇数,偶数的话先保存一个2然后把n变成n/2,接下来两者的处理方式都一样,都是用判素数的方法一旦遇到第一个因数就输出该数和n/该数,否则就输出NO,尽量开longlong,判素数用那个枚举因数的办法这样便于输出
- (21:18)AC了,根本没开longlong呢。。