复习笔记1

~( TロT)σ   小小年纪忘性怎么会这么大的呀,才学了不久怎么就都忘了呢,我是从什么时候开始学着不记事的呢??啊啊啊,习惯养成了呀,对所有的事都不在意,根本不过脑子,再好的理解力也赶不上惊人的忘记速率哎。。算了,可以培养出来的淡忘能力这真的不好改的,而且记太多事情很累的。就这样吧,记个笔记,忘记了回来再看吧,不怂,且行且看着就好。

这次的笔记是复习一下结构体的初始化,以及操作符的定义,还有就是记录一下刚学的sort函数compare的重载吧

结构体的定义及其成员的初始化。这是直接摘自我的实验报告。还好还好,我的实验报告写的还行,稍微再改改。程序啥意思不重要,就不解释了啊,反正也不难。

  1. #include<stdio.h> 
    #include<math.h>
    struct Vector2D{
    	double x,y;
    	/*double x=0,y=0;进行初始化?nonono,it is wrong.因为:通常情况下,不应该在
    	类内部初始化成员!!无论是否为静态、是否为常量、是否为int等!!统统不建议在类
    	内初始化,因为本质上类只是声明,并不分配内存,而初始化会分配内存,类内初始化
    	会将两个过程混在一起!*/
    	//成员的初始化,若无初始参数,初始化为0
    	Vector2D (const double a=0,double b=0): x(a),y(b){}
    	/*这个函数叫做构造函数,和它兄弟析构函数是没有声明类型和返回值的。构造函数
    	用来初始化自定义类型。其名称和结构体的名称一致。*/
    	//执行a=b,将b的值赋给a 
    	Vector2D (const  Vector2D& a): x(a.x),y(a.y){}
    	//计算两向量的数量积 
    	double dot(Vector2D b){
    		double t;
    		t=x*b.x+y*b.y;
    		return t;
    	}
    	//计算向量的 模 
    	double norm (){
    		double t;
    		t=sqrt(x*x+y*y);//突然想起,曾经因为不知道传入sqrt的参数是double还头疼了许久呢
    		return t;
    	}
    	//计算两向量的夹角, cos=数量积 / 模之积
    	double angle(Vector2D other){
    	 double a= dot(other)/norm ()/other.norm() ;
    	 //1e-9十的负九次方 
    	 /* 到这不得不说下abs()和fabs()了,一个是对整数取整,一个是对浮点数取整,浮点数转化为int时有精度
    	 损失的 ,用的时候得注意下呀*/
    	 if(fabs(fabs(a)-1)<1e-9)//double是有误差的 
    	 {
    	 	if(a>0)
    	 		a=1;
    	 	else 
    	 		a=-1;
    	 }
    	 return acos(a);//反三角函数 
    	 }
    	 //+的重载 
    	 /*为什么要重载操作符呢?因为操作符真的很好用啊,简洁明了。但对于自己定义的数据类型,
    	 原本操作符就么用了。这时候就可以重载下操作符,告诉计算机,对于自己定义的这个数据类
    	 型,某个操作符是什么意思。这个函数的重载差不多,重载后操作符还是原来的样子,但是添
    	 加了一个副本,使用是通过参数来判断用原来的版本还是用新添的副本*/
    	Vector2D operator + (Vector2D other){
    		Vector2D temp(x+other.x,y+other.y);
    		return  temp;
    	}
    }; 
    int main(){
    	Vector2D a(4.0,3.0);//诺,这个是初始化参数为4.0,3.0
    	Vector2D b;//无初始化参数
    	b=a;
    	for(int i=0;i<2;++i){
    		scanf("%lf %lf %lf %lf",&a.x,&a.y,&b.x,&b.y);
    		printf("%f\n",b.angle(a)*180/3.141592659);
    	}
    	return 0;
    }

----分割线----------------------------------------------------------------------------------------------------------------------------------------------------------------------

sort函数的使用:

sort可以传两个参数,第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址。

比如要对a[i]->a[j]排序 ,sort(a+i,a+j),;

这个很好理解的,下面说下三个参数的sort()。前两个参数的意义和上面相同,第三参数呢是比较函数。比较函数是一个自己定义的函数,返回值是bool型,规定什么样的关系是“<”。

来两个栗子;

sort()可以进行降序排序

bool cmp(int x,int y){
	return a>b;
}
sort(a,a+n,cmp);

 栗子二:也不说啥题意了,直接上题目好了

chika很喜欢吃蜜柑。每个蜜柑有一定的酸度和甜度,chika喜欢吃甜的,但不喜欢吃酸的。
一共有n个蜜柑,chika吃k个蜜柑,将获得所吃的甜度之和与酸度之和。chika想获得尽可能大的甜度总和。如果有多种方案,她希望总酸度尽可能小。
她想知道,最终的总酸度和总甜度是多少?
【输入】
第一行有两个正整数n和k,分别代表蜜柑总数和chika吃的蜜柑数量。(1≤k≤n≤200000)
第二行有n个正整数ai,分别代表每个蜜柑的酸度。(1≤ai≤1e9)
第二行有n个正整数bi,分别代表每个蜜柑的甜度。(1≤bi≤1e9)
【输出】
两个正整数,用空格隔开。分别表示总酸度和总甜度。
【样例输入】
3 2
1 3 4
2 2 5
【样例输出】
5 7

解法:把甜度从高到低排序,同时甜度相等按酸度降低排序

怎么排序呢,冒泡?好像就对这个熟一点,但看数据范围,冒泡一定会超时的吖。其他排序只知道个名字,所以还是直接调sort吧

  1. #include <stdio.h>
    #include <iostream>
    #include <string>
    #include <math.h>
    #include <algorithm>
    using namespace std;
    struct point {
    	long long x,y;//x 为酸度,y为甜度
    	point (const long long a=0,long long b=0):x(a),y(b){}
    };
    
    bool cmp(point s,point c){
    	if(s.y==c.y)	return s.x>c.y;//甜度相同,按酸度降序排序
    	else return s.y<c.y;//甜度升序
    }
    
    int main()
    {
    	int n,k;
    	cin>>n>>k;
    	point a[n];//c++允许这样做,c不允许
    	for(int i=0;i<n;++i)	cin>>a[i].x;
    	for(int i=0;i<n;++i)	cin>>a[i].y;
    	sort(a,a+n,cmp);
    	point te;//注意哦,te的x,y是已经被初始化为0的
    	for(int i=n-1;i>=n;--i){
    		te.x+=a[i].x,te.y+=a[i].y;
    	}
    	cout<<te.x<<' '<<te.y<<endl;
    	return 0;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值