初赛江山赛区十六名然后时间冲突复赛放弃了。(放弃了免费旅游qaq!)
本来一开始就想写一个总结 因为之前搜dalao们的博客的时候很少有江山赛区的总结 复赛结束也有一段时间了 这段时间acm比赛有点多课程也比较紧 所以一直拖到现在才开始写总结
首先说明一下队伍情况,我和我舍友兼acm队友zc以及一个自动化dalao一起做的(三个大二萌新)。其实一开始我们不感觉自己是萌新,结果一参加才发现原来是这个比赛基本都是研究生在参加。而且我们好像还是我们学校唯一一支参加的队伍(独苗也是很惨了,都没法找人交流)所以一直在闭门造车(不可取)。
这个题目大意就是给你一堆车辆和道路,让你在不死锁(车辆之间互相影响导致无法调度)的情况下进行调度,然后优劣判断的标准是从第一辆车出发到最后一辆车到达终点所调度时间最少。
我们是从赛题发布三天之后开始做的,我负责写车辆调度,我队友负责数据处理(话说这次比赛的数据处理好像比较难搞?我队友写了400多行)作为萌新兼菜鸡上来完全懵逼,车辆怎么调度啊?实时规划?A*?D*?
不,全都没有!
事实上输入输出完事之后我直接莽了一发spfa+堆优化(最短路)死锁了,然后再对每辆车加个延时就跑出来了(好像第一次跑了4w多秒)
然后我们最终的算法(初赛)大概就是
1.预处理 先按照车速快慢排序,再按照时间排序,最后把车速很慢的车放到最后发
2.最短路计算优化 2.1对快慢车以及车道速度之间的关系进行道路权值的变化
2.2对节点权值进行统计 节点权值越大的道路权值越大
(所以是变相A*?
3.迭代计算最短路(就是把spfa跑很多次
4.延时发车
(大概就是这样 然后期间就是不停的调参 初赛最终3400+秒 16名)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
上面可能对于以后参加这个比赛的人没啥用
下面是一些建议和吐槽
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
还有一点就是关于判题器(就是自己可以本地测试车辆调度时间,可以实现实时调度车辆,也可以快速调参),因为车辆优化一直是我和自动化队友一起做的,另一个队友在写判题器。结果写到最后发现时间复杂度太高,就放弃了。谁能想到初赛当天把原本规定的时间扩展了三倍。所以我们就gg了。这里有一个教训,就是没有跟随大家的步伐,因为大佬们都在搞判题器实时规划,而且明显这样做更优,所以我这里推荐是跟进一下群里大佬们的进度是没错的!(我们复赛确实想这样搞但是考虑到时间冲突反正复赛去不了,就直接放弃了 随缘搞了一下就完事了)
关于语言。我们选择的是c++(不要问我为啥,因为我们只会这个)java和python一开始就没考虑过,时间长,而且用它们还不如我们用c++玩的溜一点。还是看比赛具体是怎么样的叭,选择合适自己的就好。
关于赛区。江山赛区很弱,杭厦啊还有一个赛区也挺强的(也可以说是杭电和成电强哈哈哈哈哈)
关于时间。理论上推荐大三以上以及研究生做,因为大二课还是多没时间做而且知识储备也还不够(我们实在是头铁)
据说今年赛题很难但是由于第一次参加完全没感觉难还是简单(可能因为我们做法太粗糙太暴力了吧)
总而言之就是多交流(我们完全闭门造车诶!)多跟进一下大佬思路
希望明年我们学校不会再是独苗的状态了23333
有一个很有意思的事情就是 有一个队伍名字是随缘进复赛的队伍初赛排到了33(前32进复赛)一开始大家在群里都开玩笑,结果前面有一个队伍违规取消了成绩,随缘老哥真的进了复赛(队名起的好也是很关键的呀!说不定我们的队名也生效了呢哈哈哈哈)
(附初赛和复赛名单 因为我搜博客的时候一直想看这种往届排名)
代码如下(风格比较乱)初赛
#include <iostream>
#include <vector>
#include <fstream>
#include <stdio.h>
#include <string>
#include <time.h>
#include <stdlib.h>
#include <queue>
#include <stack>
#include <math.h>
#include <algorithm>
#define endl "\n"
using namespace std;
typedef long long ll;
const ll INF = 0x3f3f3f3f;
const char *car_path, *road_path, *cross_path, *answer_path;
struct Crossing
{
ll crossing_number; //temporary use long long ,if sth goes wrong,use string instead
ll road[4]; //顺时针
ll crossing_original_num = 0;
int crossing_deviation = 0;
};
struct Road
{
ll road_number = 0; //temporary use long long ,if sth goes wrong,use string instead
ll road_original_num = 0;
ll start_crossing = 0, end_crossing = 0;
ll road_length = 0;
ll road_width = 0;
ll highest_speed = 0;
bool is_both_way = false;
//if is_both_way then the details of the road is place after n/2 n is the total path of the road.
int road_deviation = 0;
vector<vector<ll>> details; //record the detail of road about which car in which road
};
struct Car
{
ll car_number = 0;
ll start_crossing_number = 0, end_crossing_number = 0; //temporary use long long ,if sth goes wrong,use string instead
ll car_speed = 0;
ll start_time = 0;
ll car_original_num = 0;
int car_deviation = 0;
ll dealy_time = 0;
//need to init;
stack<ll> path; //record the shortest path
ll direction = 0; //0 是直行,1是右转, -1 是左转
ll pos; //distance from the start of the road
ll actual_speed = 0;
ll distance = 0;
//ll time;
};
struct Real_Time
{
vector<ll> path;
ll real_start_time;
ll car_original_num;
ll car_number;
bool is_started = false;
bool is_ended = false;
bool is_waited; //终止状态为false 等待状态是true
};
struct Qnode
{
ll crossingid;
ll cost;
Qnode(ll _cid = 0, ll _cost = 0) : crossingid(_cid), cost(_cost) {}
bool operator<(const Qnode &r) const
{
return cost > r.cost;
}
};
ll speed_position = 0, speed_judge;
;
vector<Real_Time> realtime;
vector<Car> car;
vector<Road> road;
vector<Crossing> crossing;
vector<bool> vis; //vis = true if it in queue
vector<ll> dist; //smallest distance from start
vector<ll> pre; //前驱节点
vector<bool> visc;
ll crossing_number;
ll min_start_time = 0x3f3f3f3f;
//ll car_deviation, road_deviation, crossing_deviation;//编号和数组位置之间的偏差
vector<ll> number_passes;
vector<ll> speed;
bool cmp_ad(const Car &a, const Car &b)
{
if (a.car_speed == b.car_speed)
{
return a.start_time < b.start_time;
}
else
{
return a.car_speed > b.car_speed;
}
}
ll max(ll a, ll b)
{
if (a < b)
return b;
else
return a;
}
void delay_sort()
{
fill(visc.begin(), visc.end(), false);
int sum = 0;
ll start = -1;
vector<