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

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. [转帖]Docker save and load镜像保存

    Docker save and load镜像保存 https://www.cnblogs.com/zhuochong/p/10064350.html docker save 和 load 以及 imp ...

  2. Redis五大数据类型

    首先说明下,Redis是:单线程+多路IO复用技术!!! string set  >  key  +  zset          list hash 常用的几个命令: >keys * 查 ...

  3. Java多线程之静态代理

    package org.study2.javabase.ThreadsDemo.staticproxy; /** * @Date:2018-09-18 静态代理 设计模式 * 1.真实角色 * 2.代 ...

  4. 定位linux jdk安装路径

    如何在一台Linux服务器上查找JDK的安装路径呢? 有那些方法可以查找定位JDK的安装路径?是否有一些局限性呢? 下面总结了一下如何查找JDK安装路径的方法. 1:echo $JAVA_HOME 使 ...

  5. javascript中关于value的一个小知识点(value既是属性也是变量)

    今天在学习input的value值时,发现这么一个小知识点,以前理解不太透彻 [1]以下这种情况是常见情况,会弹出“测试内容” <input type="button" va ...

  6. Python中数字之间的进制转换

    Python中的数据转换 在python中可以通过内置方法进行相应的进制转换,但需记得转化成非十进制时,都会将数字转化成字符串 转化成二进制 a = 10 #声明数字,默认十进制 b = bin(a) ...

  7. 在GitHub上读大学:涵盖清华,北大,浙大等大学课程

    来自多位GitHub网友在GitHub分享的几组学习课程项目, 学习课程包含清华,北大,浙大,中科大,上海交大, 等中国多所名校的英语,AI高数,人工智能等课程以及一些讲义考题. 如果你想了解这些大学 ...

  8. NFS共享存储的使用

    概述 NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布.功能是通过网络让不同的机器.不同的操作系统能够彼此 ...

  9. nginx-添加禁止访问规则

    location ~* /application/(admin|index)/static/.*$ { allow all; } location ~* /(applicaion|addos|coe| ...

  10. Sudoku POJ - 3076

    Sudoku Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 5769   Accepted: 2684 Descripti ...