SXYZ-6.27专题比赛
好的,现在正式定义今天的比赛为一场伤心的比赛。

↑这张图片首先能说明一些问题,但这并不是关键。
↓这才是伤心的关键

↑第一题文件输入输入爆

↑第二题文件名直接爆
评语,一个比一个离谱!
然后只是很简单的把这两个小错误改正确以后就有83分了,不知道该喜还是该悲。
上图

Ps:这是第一次犯这种SB错误,主要是平时自己就很小心。但依旧:
吃一堑,长一智
好的,就在刚刚,一脸雾水听完题目分析出来,又发现一个惊人事实,那就是我T2的文件输入输出名都是错的!!!!
(狂喜)
T1 graph
图
首先考虑暴力做法+优化,拿了54分,思路是遍历每一个点,一每一个点为起点, dfs 深搜 K 个节点,跟 ans 取个最大值,最优解一定在这其中。
54分代码:
#include<bits/stdc++.h>
using namespace std;//听我说谢谢你,因为有你。。。。
#define N 20000
int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
int nex[N],first[N],w[N],to[N],tot=0,vis[N];
int n,m,k,ans;
void add(int x,int y,int z){
nex[++tot]=first[x];
first[x]=tot;
to[tot]=y;
w[tot]=z;
}
void dfs(int u,int fa,int st,int sum){
if(st==k){
ans=max(ans,sum);
return ;
}
++st;
for(int e=first[u];e;e=nex[e]){
int v=to[e];
if(v!=fa&&vis[v]==0){
vis[v]=1;
sum+=w[e];
// printf("u%d,v%d,w%d,st%d,sum%d\n",u,v,w[e],st,sum);
dfs(v,u,st,sum);
vis[v]=0;
sum-=w[e];
}
}
}
int main(){
freopen("graph.in","r",stdin);
freopen("graph.out","w",stdout);
int T;
T=read();
while(T--){
n=read();
m=read();
k=read();
tot=0;
ans=0;
memset(first,0,sizeof(first));
memset(vis,0,sizeof(vis));
for(int i=1;i<=m;i++){
int a,b,c;
a=read();b=read();c=read();
add(a,b,c);
add(b,a,c);
}
for(int i=1;i<=n;i++){
dfs(i,0,1,0);
}
if(ans!=0) printf("%d\n",ans);
else printf("-1\n");
}
return 0;
}
思考正解做法,
color coding 对图中的点随机染色,色彩个数为 k,然后进行 dp,设 \(f[i][S]\) 为当前 i 点颜色合集为 S 的权值。
令所有 \(f[i][S] = −inf\),然后对于每个顶点 x 和其颜色 col[x],f[1 << col[x]][x] = 0。然后从小到大枚举状态 S,
每一个状态 S 下枚举边,对于每条边我们记其相邻 2 端为 xx, yy,边权为 zz。
\]
\]
重复执行足够多次以后取最优解。
#include<bits/stdc++.h>
const int N=1e4+5,B=500;
using namespace std;
mt19937 rnd(19260817);
int n,m,k,col[N],S;
struct edge{int x,y,z;}e[N];
int f[N][64];
int check()
{
for(int i=1;i<=n;i++)
{
for(int j=0;j<S;j++)f[i][j]=-2e9;
f[i][1<<col[i]]=0;
}
for(int j=0;j<S;j++)
for(int i=1,xx,yy,zz;i<=m;i++)
{
xx=e[i].x;yy=e[i].y;zz=e[i].z;
if((j>>col[xx])&1)f[xx][j]=max(f[xx][j],f[yy][j^(1<<col[xx])]+zz);
if((j>>col[yy])&1)f[yy][j]=max(f[yy][j],f[xx][j^(1<<col[yy])]+zz);
}
int res=-1;
for(int i=1;i<=n;i++)res=max(res,f[i][S-1]);
return res;
}
int ans;
int T;
int main()
{
freopen("graph.in","r",stdin);
freopen("graph.out","w",stdout);
ios::sync_with_stdio(false);cin.tie(0);
cin>>T;
while(T--){
cin>>n>>m>>k;S=1<<k;
for(int i=1;i<=m;i++)cin>>e[i].x>>e[i].y>>e[i].z;
ans=-1;
for(int i=1;i<=B;i++){
for(int j=1;j<=n;j++)col[j]=rnd()%k;
ans=max(ans,check());
}
cout<<ans<<'\n';
}
return 0;
}
T2 random
随机
这道题考场没写出暴力,啥,暴力都没写出来,主要是图的数据结构只会邻接表,不会以边存图。
来看一看全场做高分80分陈鑫的做法:模拟退货,而且思想异常的朴素,这就是高手与我的区别吗,随机将点排个序,然后遍历一遍,求前第 i 个做删点处理的代价,多做几次求 min。
80分大佬代码:
#include <bits/stdc++.h>
#define eb emplace_back
using namespace std;
using ll = long long;
mt19937 mt(random_device{}());
int t, n, m;
ll a, b;
ll ans;
pair <int, int> ed[45];
vector <int> gra[45];
bool mp[45][45];
bool vis[45];
int bs[45];
ll js() {
ll ans = a * m;
for (int j = 0; j <= n; ++j) {
memset(vis, 0, sizeof(vis));
int totp = j;
for (int i = 1; i <= j; ++i) {
bool flag = 0;
for (auto &k : gra[bs[i]]) {
if (!vis[k]) flag = 1;
vis[k] = 1;
}
if (!flag) --totp;
}
int tot = 0;
for (int k = 0; k < m; ++k) if (vis[k]) ++tot;
ans = min(ans, b * totp + a * (m - tot));
}
return ans;
}
void mnth() {
double T = 100000, dt = 0.99;
while (T > 1e-8) {
int x = mt() % (n - 1) + 1, y = mt() % (n - x) + x + 1;
swap(bs[x], bs[y]);
ll tmp = js();
if (tmp < ans) {
ans = tmp;
} else if (exp(- abs(ans - tmp) / T) * 6553600 < mt() % 6553600) {
swap(bs[x], bs[y]);
}
T *= dt;
}
}
int main() {
freopen("random.in", "r", stdin);
freopen("random.out", "w", stdout);
scanf("%d", &t);
while (t--) {
scanf("%d%d%lld%lld", &n, &m, &a, &b);
for (int i = 1; i <= n; ++i) gra[i].clear();
memset(mp, 0, sizeof(mp));
memset(bs, 0, sizeof(bs));
ans = 1e18;
for (int i = 0; i < m; ++i) {
scanf ("%d%d", &ed[i].first, &ed[i].second);
gra[ed[i].first].eb(i);
gra[ed[i].second].eb(i);
}
for (int i = 1; i <= n; ++i) bs[i] = i;
srand(time(NULL));
random_shuffle(bs + 1, bs + n + 1);
mnth();mnth();mnth();
mnth();mnth();mnth();
mnth();mnth();mnth();
printf("%lld\n", ans);
}
return 0;
}
T3 substring
子串Ⅰ
考场上做了个简单判断,按照二的幂次分别输出0和1,然后随机情况输出0和1,竟然骗 了29.没想到这道题正解竟然是根据特殊性质做的,叫个什么 De Bruijn 序列。跑了,跑了。
不过部分分是可以拿de:
M.A.Martin 于 1934 年证明了以下贪心算法对所有的 n ≥ 2 都可以构造出一个长度
2n 的 De Bruijn 序列:
写出 n 个 0。
如果在序列尾部添加一个 1 后,和前面相连构成已经出现过的长为 n 的 01 子串,
则在序列尾部添加一个 0,否则在序列尾部添加一个 1。
- 序列若还不够 2n 项,则返回步骤 2。否则序列就是一个长度为 2n 次的 De Bruijn
序列。
SXYZ-6.27专题比赛的更多相关文章
- NOIP注意事项
高精度 a.加法 b.减法 c.乘法(应该只会有高精乘单精) d.高精度除单精 (后面c,d考的可能性较小 ...
- hdu3729 I'm Telling the Truth (二分图的最大匹配)
http://acm.hdu.edu.cn/showproblem.php?pid=3729 I'm Telling the Truth Time Limit: 2000/1000 MS (Java/ ...
- Codeforces Round #378 (Div. 2) C D
在实验室通宵 一边做水题一边准备随时躲起来以免被门卫大爷巡查发现..结果居然没来.. 本来以为可以加几分变个颜色..结果挂了CD...状态有点差...思维不太活跃 沉迷暴力不能自拔 D 给出n个长方体 ...
- Codeforces 1077E Thematic Contests(二分)
题目链接:Thematic Contests 题意:给出n道有类型的题目,每天组织一场专题比赛,该天题目数量必须是前一天的2倍,第一天的题目数量可以任意选择,求能消耗的最多题目数量. 题解:先整理成不 ...
- Codeforces Round #521 (Div. 3)
B 题过的有些牵强,浪费了很多时间,这种题一定想好思路和边界条件再打,争取一发过. D 题最开始读错题,后面最后发现可以重复感觉就没法做了,现在想来,数据量大,但是数据范围小枚举不行,二分还是可以的 ...
- NOIP考纲总结+NOIP考前经验谈
首先来一张图,很直观(截止到2012年数据) 下面是收集的一些,我改了一下 红色加粗表示特别重要,必须掌握 绿色加粗表示最好掌握,可能性不是很大,但是某些可以提高程序效率 高精度 a.加法 b.减法 ...
- NOIP前必须记住的30句话
NOIP前必须记住的30句话 1.比赛前一天晚上请准备好你的各种证件,事先查好去往考场的路线2.比赛之前请先调整你的屏幕分辨率到你喜欢的大小3.比赛之前请把编译器的字体调为你平时惯用的字体,尤其是注意 ...
- NOIP考纲
首先来一张图,很直观(截止到2012年数据) 下面是收集的一些,我改了一下 红色加粗表示特别重要,必须掌握绿色加粗表示最好掌握,可能性不是很大,但是某些可以提高程序效率 高精度 a.加法 b.减法 c ...
- NOIP2013,复赛及同步赛,报名及比赛,专题页面
本通知的对象仅仅是福州第十九中学的学生 所有参加复赛以及同步赛的选手,请务必要仔细阅读:<关于CCF NOIP2013复赛有关事宜的通知>,里面有比赛的时间.地点.以及比赛费用的说明. 参 ...
- LeetCode专题-Python实现之第27题:Remove Element
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
随机推荐
- CSP2023-J/S 游记
本人 初二 \(\texttt{HA}\) CSP2023 成绩: CSP-J 第一轮:\(86.5\) CSP-S 第一轮:\(41.5\) CSP-J 第二轮:\(100+100+100+0=30 ...
- Unity入门学习日记(一)
UGUI的初步使用 1. Canvas 使用UI的时候,所有的UI元素都作为Canvas的子节点存在于Canvas中,如果创建UI元素时没有Canvas作为父节点,会自动生成一个Canvas,是一位& ...
- Windows10 myeclipse 本地部署javaweb项目
Windows10 myeclipse 本地部署javaweb项目 一,先在网上寻找相关的项目,自己研究学习之后,进行二次开发 原文地址https://www.cnblogs.com/wydyzcnc ...
- 【Mybatis】12 复杂关联查询
一对多 & 多对一 关联查询 数据库准备: 一个班级表,字段:班级ID + 班级名称 一个学生表,字段:学生ID + 学生姓名 + 所属的班级ID # 班级表 班级ID+班级名称 CREATE ...
- PyCharm2024 专业版激活设置中文
PyCharm2024 专业版激活设置中文 官网下载最新版:https://www.jetbrains.com/zh-cn/pycharm/download 「hack-jet激活idea家族.zip ...
- 如何计算两个正太分布的KL散度 —— 正太分布的KL散度 (Kullback-Leibler divergence) 计算
参考: https://blog.csdn.net/int_main_Roland/article/details/124650909 给出实现代码: def get_kl(): mean0, log ...
- Jax框架 —— 如何在没有GPU和TPU的设备上debug代码 —— 在CPU上使用GPU仿真设置 —— Jax框架在多卡设备上的自动并行特性的仿真体验
Jax计算框架是Google用来取代Tensorflow的新一代计算框架,这个框架使用类似pytorch的技术,但是在pytorch技术之上加入了更加强大的技术,但是这也导致该框架使用起来要比pyto ...
- 元学习:元学习的始祖论文——《On the Optimization of a Synaptic Learning Rule》
============================================= 这个论文保持着上世纪人工智能论文的特点,与其说是计算机类论文更不如说是偏生物科学方面的论文,这也可能是因为当 ...
- Vue Vine:带给你全新的 Vue 书写体验!
你好,我是 Kagol,个人公众号:前端开源星球. 上个月和 TinyVue 的小伙伴们一起参加了 VueConf 24 大会,有幸认识沈青川大佬,并了解了他的 Vue Vine 项目,Vue Vin ...
- vue之v-model表单绑定
1.背景 2.简单使用 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...