暑假集训7月13日(困成猪的一天)
线段树
并查集
dijkstra:每次找到未确定最短距离的一个点,把它放在S集合中,并用它带来更新它的出边的距离,n次。
bellman:外循环第一次找经过一条边的最短距离,备份当前最短距离;外循环第二次找经过两条边的最短距离,备份当前最短距离......外循环第k次找经过k条边的最短距离,备份当前最短距离,得到的是最多经过不超过k条边的最短距离。
判断一个数是整数还是小数
if ((int)floa==floa)yes;
else no;
vector resize理解:
void reserve (size_type n);
reserver函数用来给vector预分配存储区大小,即capacity的值 ,但是没有给这段内存进行初始化。reserve 的参数n是推荐预分配内存的大小,实际分配的可能等于或大于这个值,即n大于capacity的值,就会reallocate内存 capacity的值会大于或者等于n 。这样,当调用push_back函数使得size 超过原来的默认分配的capacity值时 避免了内存重分配开销。
需要注意的是:reserve 函数分配出来的内存空间,只是表示vector可以利用这部分内存,但vector不能有效地访问这些内存空间,访问的时候就会出现越界现象,导致程序崩溃。
void resize (size_type n);
void resize (size_type n, value_type val);
resize函数重新分配大小,改变容器的大小,并且创建对象
当n小于当前size()值时候,vector首先会减少size()值 保存前n个元素,然后将超出n的元素删除(remove and destroy)
当n大于当前size()值时候,vector会插入相应数量的元素 使得size()值达到n,并对这些元素进行初始化,如果调用上面的第二个resize函数,指定val,vector会用val来初始化这些新插入的元素
当n大于capacity()值的时候,会自动分配重新分配内存存储空间。
J - Cake 123
打无脑暴力肯定不行,只好打有脑暴力。先暴力算出A和B中的所有可能,取前k个,再用这k个跟C中暴力求所有可能,再取前k个。
#include <bits/stdc++.h> using namespace std; typedef long long ll; int x,y,z; ll a[1010],b[1010],c[1010]; vector<ll>val,ans; bool cmp(ll a,ll b) { return a>b; } signed main() { int x,y,z,k; cin>>x>>y>>z>>k; for (int i=0;i<x;i++)cin>>a[i]; for (int i=0;i<y;i++)cin>>b[i]; for (int i=0;i<z;i++)cin>>c[i]; for (int i=0;i<x;i++) for (int j=0;j<y;j++) val.push_back(a[i]+b[j]); sort(val.begin(),val.end(),cmp); val.resize(k); for (int i=0;i<k;i++) for (int j=0;j<z;j++) ans.push_back(val[i]+c[j]); sort(ans.begin(),ans.end(),cmp); for (int i=0;i<k;i++) cout<<ans[i]<<"\n"; return 0; }

浙公网安备 33010602011771号