暑假集训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;
}

 

posted @ 2022-07-13 19:40  好腻友Π  阅读(21)  评论(0)    收藏  举报