收到意见,认为每天的程序和随笔放在一起写的博客太长了,于是分开整理

day1

模拟赛,看了看提高a组t1的样例就不太想写,于是转而写b组

t1:

Description

给定一个n个点m条边的有向图,有k个标记点,要求从规定的起点按任意顺序经过所有标记点到达规定的终点,问最短的距离是多少。
 

Input

第一行5个整数n、m、k、s、t,表示点个数、边条数、标记点个数、起点编号、终点编号。

接下来m行每行3个整数x、y、z,表示有一条从x到y的长为z的有向边。

接下来k行每行一个整数表示标记点编号。

Output

输出一个整数,表示最短距离,若没有方案可行输出-1。

找出来k个标记点和起点到所有点的最短路,然后dfs经过k个点的顺序就可以啦!

当时主要犯了两个错误,1.没有判无解情况,2.设的初值为0x3f3f3f3f,有点小。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
struct NODE
{
int flg[11],cur;
long long dis;
};
struct Edge
{
int v,nxt,val;
}e[100010];
int head[50010],n,m,k,s,t,cnt,flg,pa;
long long dis[50010][11],vis[50010],num[50010];
int cut[50010];
long long ans;
void add(int u,int v,long long val)
{
e[++cnt].nxt=head[u];
e[cnt].v=v;
e[cnt].val=val;
head[u]=cnt;
}
void spfa(int st,int now)
{
queue<int>q;
for(int i=1;i<=n;i++)
dis[i][now]=0xffffffff;
for(int i=1;i<=n;i++)
vis[i]=0;
dis[st][now]=0;
vis[st]=1;
q.push(st);
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=0;
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].v;
if(dis[v][now]>dis[u][now]+e[i].val)
{
dis[v][now]=dis[u][now]+e[i].val;
if(!vis[v])
{
q.push(v);
vis[v]=1;
}
}
}
}
}
void dfs(int lst_cur,int lst_num,long long ndis)
{
if(lst_num==k)
{
if(dis[t][lst_cur]==0xffffffff)
return;
ndis+=dis[t][lst_cur];
ans=min(ans,ndis);
ndis-=dis[t][lst_cur];
flg=1;
return ;
}
for(int i=1;i<=k;i++)
{
if(vis[i])
continue;
if(dis[cut[i]][lst_cur]==0xffffffff)
continue;
vis[i]=1;
ndis+=dis[cut[i]][lst_cur];
dfs(i,lst_num+1,ndis);
ndis-=dis[cut[i]][lst_cur];
vis[i]=0;
}
return;
}
int main()
{
scanf("%d%d%d%d%d",&n,&m,&k,&s,&t);
for(int i=1;i<=m;i++)
{
int x,y;
long long z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
if(k==0)
{
spfa(s,0);
if(dis[t][0]==0xffffffff)
dis[t][0]=-1;
printf("%lld",dis[t][0]);
}
else
{
cut[0]=s;
for(int i=1;i<=k;i++)
{
scanf("%d",&cut[i]);
}
for(int i=0;i<=k;i++)
spfa(cut[i],i);
for(int i=1;i<=k;i++)
vis[i]=0;
ans=0xffffffff;
dfs(0,0,0);
if(!flg)
cout<<"-1";
else
printf("%lld",ans);
}
return 0;
}

t2:

Description

万老师听说某大国很流行穿越,于是他就想写一个关于穿越的剧本。

闲话休提。话说老师穿越到了某一个剑与魔法的大陆。因为如此这般,所以老师从维娜艾那里得到了预言。老师一共被告知了若干件按顺序结算的事件。这些事件分为两类:战役事件(CASE)、穿越回去事件(END)。战役事件可以选择是否参加,参加了之后会获得一定的金钱。每个END事件发生需要至少参加一定数量的战役事件。特别的是,END事件如果满足要求就会强制发生。老师希望在大陆玩个够,所以他要求只有最后一个END事件会发生。老师希望获得最多的金钱,所以求助于你。

 

Input

第一行一个数N,表示输入文件有多少行。

接下来每一行用空格隔开一个字符和一个整数。字符为“c”表示战役事件,接下来的整数表示这次涨RP顺带有多少钱;字符为“e”表示穿越回去事件,接下来的整数代表至少要涨多少RP。最后一个事件保证是END事件。

Output

第一行一个整数,最多金钱数目。

若不可能则输出-1。

维护一个小根堆,每次遇见限制就弹出堆顶直到满足限制条件。这道题爆零爆的非常郁闷,特别注意一下最后一个条件只要rp大于要求就行,我理解错题意了,认为必须等于,于是用正确的方法却爆了零...

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
priority_queue<int>q;
int main()
{
int n,cnt=0;
int flg=0;
char c;
scanf("%d",&n);
for(int i=1;i<n;i++)
{
cin>>c;
if(c=='c')
{
int x;
scanf("%d",&x);
q.push(-x);
cnt++;
}
if(c=='e')
{
int x;
scanf("%d",&x);
if(x==0)
flg=1;
x--;
while(q.size()>x)
{
q.pop();
}
}
}
cin>>c;
int p;
scanf("%d",&p);
int ans=0;
if(q.size()<p)
flg=1;
else
{
while(!q.empty())
{
int t=q.top();
q.pop();
ans-=t;
}
}
if(flg)
ans=-1;
cout<<ans;
return 0;
}

t3:

平面上有n个点,求出用这些点可以构成的三角形数。

Input

第一行一个整数n。

接下来n行,每行两个整数,表示点的坐标。

Output

输出仅一个整数,表示所求答案。

当时很懵,强行打了个n^3暴力,用斜率判是否共线,给了50分(贼良心呀)。

正解是枚举一个点,求此点与其他点的斜率,斜率相同说明共线。记得不要重复计算。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long c[3010][5],ans;
double lk[3010];
struct NODE
{
int x,y;
}node[3010];
bool cmp(NODE a,NODE b)
{
if(a.y==b.y)
return a.x<b.x;
else
return a.y<b.y;
}
int main()
{
freopen("triangle.in","r",stdin);
freopen("triangle.out","w",stdout);
int n;
scanf("%d",&n);
for(int i=0;i<=3010;i++)
c[i][0]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=3;j++)
c[i][j]=c[i-1][j-1]+c[i-1][j];
ans=c[n][3];
for(int i=1;i<=n;i++)
scanf("%d%d",&node[i].x,&node[i].y);
sort(node+1,node+1+n,cmp);
int nn=n-1;
for(int i=1;i<nn;i++)
{
int con=0,tot=0;
for(int j=i+1;j<=n;j++)
{
if(node[j].x==node[i].x)
{
tot++;
continue;
}
lk[++con]=(double)(node[j].y-node[i].y)/(double)(node[j].x-node[i].x);
}
sort(lk+1,lk+1+con);
ans-=c[tot][2];
tot=1;
for(int j=2;j<=con;j++)
{
if(lk[j]==lk[j-1])
tot++;
else
{
if(tot==1)
continue;
ans-=c[tot][2];
tot=1;
}
}
if(tot!=1)
ans-=c[tot][2];
}
cout<<ans;
fclose(stdin);
fclose(stdout);
return 0;
}

我这里还排了个序,其实应该不需要。

改完啦!

纪中2018暑假培训day1提高b组改题记录的更多相关文章

  1. 纪中2018暑假培训day7提高b组改题记录

    由于今天太颓了,所以没有解释 t1: Description 码零鼠是一只很喜欢mx数学的神犇,上面那个不是ta本人的样子.这天,ta在研究一个神奇的数列,这个数列是这样的:a0 = 1an = ai ...

  2. 纪中2018暑假培训day3提高a组改题记录(混有部分b组)

    day3 模拟赛,看了看a组题,发现是博弈论,非常开心(因为好玩),于是做的a组.结果差点爆零,死命纠结t1的sg函数,但其实只是一个dp,不用扯到sg函数的那种. t1: Description 被 ...

  3. 纪中2018暑假培训day5提高b组改题记录

    因为今天省选组也做a组,以为今天a组会很难,就做了做b组.t1和t3强行暴力,好在有t2保底.t1和正解就差一点,然而考试时死活想不起来...... 今天改题可以少改一道了!ovo 救救孩子吧!t1T ...

  4. NOIP2016提高A组 B题 【HDU3072】【JZOJ4686】通讯

    题目描述 “这一切都是命运石之门的选择.” 试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短 信,并由此得知了伦太郎制作出了电话微波炉(仮). 为了掌握时间机器的技术,SERN总部 ...

  5. NOIP2016提高A组 A题 礼物—概率状压dp

    题目描述 夏川的生日就要到了.作为夏川形式上的男朋友,季堂打算给夏川买一些生 日礼物. 商店里一共有n种礼物.夏川每得到一种礼物,就会获得相应喜悦值Wi(每种礼物的喜悦值不能重复获得). 每次,店员会 ...

  6. 2018年蓝桥杯java b组第二题

    2.标题:方格计数 如图p1.png所示,在二维平面上有无数个1x1的小方格. 我们以某个小方格的一个顶点为圆心画一个半径为1000的圆.你能计算出这个圆里有多少个完整的小方格吗? 注意:需要提交的是 ...

  7. 2018年蓝桥杯ava b组第一题

    第一题.标题:第几天 2000年的1月1日,是那一年的第1天.那么,2000年的5月4日,是那一年的第几天? 注意:需要提交的是一个整数,不要填写任何多余内容 如果问我怎么做的,我就是看日历做的,看了 ...

  8. $NOIp$提高组做题记录

    对了我在这里必须讲一个非常重要的事情,就是前天也就是$2019.8.21$的傍晚,我决定重新做人了$!!$ 其实之前没怎么做$Noip$题,那就从现在开始叭

  9. 纪中集训 Day1

    今天早上起来吃饭,发现纪中伙食真的是太差了!!!什么都不热,早餐的面包还好,然后就迎来了美好的早晨= = 早上做一套题,T1T2果断秒,T3一看就是noi原题,还好看过题解会写,然后就愉快的码+Deb ...

随机推荐

  1. bnu——GCD SUM (莫比乌斯反演)

    题目:GCD SUM 题目链接:http://www.bnuoj.com/v3/problem_show.php?pid=39872 算法:莫比乌斯反演.优化 #include<stdio.h& ...

  2. 6s ios9.0平台 微信小程序的fixed定位兼容性问题

    如果不设置top和left的话  就会出现不显示问题

  3. Window下通过SecureCRT的SSH2跳转到另一台Linux服务器

    我工作中的示例: 先登录192.168.2.145 Your password will be expired in 200 days.Welcome to Baoleiji System.Last ...

  4. C#中is运算符

    is运算符可以检查对象是否与特定的类型兼容.“兼容”表示对象或者该类型,或者派生自该类型.例如,要检查变量是否与object类型兼容,可以使用下面的代码: int i=10; if(i  is  ob ...

  5. SQL字段类型bit 查询时注意

    sql 查询时  字段=1 或 字段=0 c# 里也是

  6. windows git支持arc命令

    本文整理了在Windows系统上安装代码审查工具Arcanist的过程.目的是配合Phabricator进行代码review.配置成功后可使用arc diff命令来发起code review. 1.安 ...

  7. 【C/C++】求解线性方程组的雅克比迭代与高斯赛德尔迭代

    雅克比迭代: /* 方程组求解的迭代法: 雅克比迭代 */ #include<bits/stdc++.h> using namespace std; ][]; ]; void swapA( ...

  8. 微信小程序——部署云函数【三】

    部署login云函数 不部署的话,点击获取openid会报错,报错如下 解决方案呢,很明显的已经告诉我们了 搭建云环境 开通 同意协议 新建环境 每个小程序账号可以创建两个免费环境 确定 部署后再次请 ...

  9. 微信小程序——安装开发工具和环境【二】

    准备 开发工具下载 获取APPID 安装工具 安装 接受协议 选择安装位置 等待安装完成 安装完成 选择项目 选择小程序 填写信息 确定 无误后,点击确定进入开发页面 建立普通快速启动模板界面

  10. LOJ6436 [PKUSC2018] 神仙的游戏 【FFT】

    题目分析: 题目要求前后缀相同,把串反过来之后是一个很明显的卷积的形式.这样我们可以完成初步判断(即可以知道哪些必然不行). 然后考虑一下虽然卷积结果成立,但是存在问号冲突的情况. 箭头之间应当不存在 ...