T1 足球联赛

题目

【题目描述】

巴蜀中学新一季的足球联赛开幕了。足球联赛有n只球队参赛,每赛季,每只球队要与其他球队各赛两场,主客各一场,赢一场得3分,输一场不得分,平局两只队伍各得一分。

英勇无畏的小鸿是机房的主力前锋,她总能在关键时刻踢出一些匪夷所思的妙球。但是很可惜,她过早的燃烧完了她的职业生涯,不过作为一个能够Burning的girl,

她的能力不止如此,她还能预测这个赛季所有球队的比赛结果。虽然她能准确预测所有比赛的结果,但是其实她不怎么厉害,Mr.Gao上数学课时她总是在sleep,因此她的脑里只有整数没有实数,

而且,她只会10以内非负整数的加法运算,因此她只有结果却无法知道谁会获得联赛的冠军。

小鸿想给冠军队伍的所有队员一个拥抱,所以她把计算结果的任务交给了你:

现在,给你一个 n*n 的矩阵表示比赛情况。第 i 行第 j 列的字母表示在第 i 只队伍在主场迎战第j只队伍的比赛情况,W 表示主队赢,L 表示主队输,D 表示平局。

现在需要你给出最后能得到小鸿拥抱的队伍编号,如有多支队伍分数最高,按字典序输出编号。

【输入格式】

第一行一个整数 n。

接下来 n 行,每行 n 个字符,表示输赢情况。

第 i 行第 i 列为 - ,因为一只队伍不可能与自己比赛。

【输出格式】

输出得分最高的队伍编号。如有多个在一行中输出,用一个空格分开。

【输入样例】

3

-WW

W-W

WW-

【输出样例】

1 2 3

【数据规模】

对于40%的数据,满足N<=20

对于100%的数据,满足N<=50

解析

纯模拟题,直接模拟就行了,没什么好说的,就是输出时要记得判断最高成绩相同的都要输出。

Code

#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
using namespace std;
int read()
{
int num=,w=;
char ch=getchar();
while(ch<''||ch>'')
{
if(ch=='-') w=-;
ch=getchar();
}
while(ch>=''&&ch<='')
{
num=(num<<)+(num<<)+ch-'';
ch=getchar();
}
return num*w;
}
int n,ans[],maxn,temp,ra[];
char s;
int main()
{
//freopen("soccer.in","r",stdin);
//freopen("soccer.out","w",stdout);
n=read();
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
cin>>s;
if(s=='W') ans[i]+=;
else if(s=='L') ans[j]+=;
else if(s=='D')
{
ans[i]+=;
ans[j]+=;
}
}
for(int i=;i<=n;i++)
if(ans[i]>maxn)
{
maxn=ans[i];
temp=;
ra[temp]=i;
}
else if(ans[i]==maxn) ra[++temp]=i;
for(int i=;i<=temp;i++) cout<<ra[i]<<" ";
return ;
//fclose(stdin);
//fclose(stdout);
}

T2 生产

题目

【题目描述】

工厂为了生产一种复杂的产品,给各个生产部门制定了详细的生产计划。那么,就经常会有生产部门要把产品送到另一个生产部门作为原料。

这是一个注重产品质量的工厂,所以每当有产品要从A部门运到B部门时,都要先从A部门送到质量检验处,检验合格后再从质量检验处运到B部门。

有些部门之间有传送带连接,厂长想知道每次将产品从一个部门运送到另一个部门最少需要多长时间。

【输入格式】

第一行两个整数n、m,n表示部门数量,m表示传送带数量。出于方便,1号部门是质量检验处。

接下来m行,每行三个整数u、v、w,表示有一条从u部门到v部门的传送带,传送过去需要w个单位时间。注意传送带是单向的。

接下来一个整数q,表示有q次运送。

接下来q行,每行两个数a、b,表示这一次要将产品从a部门运送到b部门。

【输出格式】

输出q行,每行一个整数,表示这次运送最少需要的时间。若没有传送方案,输出-1。

【输入样例】

5 5

1 2 3

1 3 5

4 1 7

5 4 1

5 3 1

3

4 2

5 3

2 3

【输出样例】

10

13

-1

【数据规模】

30%的数据,n≤100,m≤500,w=1

60%的数据,n≤100,m≤5000

另20%的数据,q=1

100%的数据,2≤n≤3000,m≤100000,2≤a,b≤n,

q≤100000,1≤u,v≤n,1≤w≤10000

有些部门之间可能有多条传送带。

工厂的员工都非常尽职尽责,他们的认真和热情决定了产品的完美,所以不必考虑产品不合格的情况。

解析

很容易看得出来这题是最短路,只不过是两条最短路:

一条是从a到1,另一条是从1到b,只需要做两遍最短路即可。

最短路推荐用dijkstra,如果用SPFA的话数据大一点、出题人卡一下就炸了。

Code

#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <queue>
using namespace std;
int read()
{
int num=,w=;
char ch=getchar();
while(ch<''||ch>'')
{
if(ch=='-') w=-;
ch=getchar();
}
while(ch>=''&&ch<='')
{
num=(num<<)+(num<<)+ch-'';
ch=getchar();
}
return num*w;
}
const int N=;
const int M=;
priority_queue< pair<int,int> > q;
int n,m,qq,tot1,tot2,head1[N],ver1[M],edge1[M],next1[M],head2[N],ver2[M],edge2[M],next2[M];
long long d1[N],d2[N];
bool vist[N];
void add1(int x,int y,int z)
{
ver1[++tot1]=y;
edge1[tot1]=z;
next1[tot1]=head1[x];
head1[x]=tot1;
}
void add2(int x,int y,int z)
{
ver2[++tot2]=y;
edge2[tot2]=z;
next2[tot2]=head2[x];
head2[x]=tot2;
}
void dijkstra1()
{
memset(d1,0x7f7f7f7f,sizeof(d1));
memset(vist,false,sizeof(vist));
d1[]=;
q.push(make_pair(,));
while(q.size())
{
int x=q.top().second;
q.pop();
if(vist[x]) continue;
vist[x]=true;
for(int i=head1[x];i;i=next1[i])
{
int y=ver1[i],z=edge1[i];
if(d1[y]>d1[x]+z)
{
d1[y]=d1[x]+z;
q.push(make_pair(-d1[y],y));
}
}
}
}
void dijkstra2()
{
memset(d2,0x7f7f7f7f,sizeof(d2));
memset(vist,false,sizeof(vist));
d2[]=;
q.push(make_pair(,));
while(q.size())
{
int x=q.top().second;
q.pop();
if(vist[x]) continue;
vist[x]=true;
for(int i=head2[x];i;i=next2[i])
{
int y=ver2[i],z=edge2[i];
if(d2[y]>d2[x]+z)
{
d2[y]=d2[x]+z;
q.push(make_pair(-d2[y],y));
}
}
}
}
int main()
{
//freopen("production.in","r",stdin);
//freopen("production.out","w",stdout);
int u,v,w,a,b;
n=read(),m=read();
for(int i=;i<=m;i++)
{
u=read(),v=read(),w=read();
add1(u,v,w);
add2(v,u,w);
}
dijkstra1();
dijkstra2();
qq=read();
for(int i=;i<=qq;i++)
{
a=read(),b=read();
if(d2[a]>=0x3f3f3f3f||d1[b]>=0x3f3f3f3f) cout<<"-1"<<endl;
else cout<<d2[a]+d1[b]<<endl;
}
return ;
//fclose(stdin);
//fclose(stdout);
}

T3 最短路径

题目

【题目描述】

平面内给出 n 个点,记横坐标最小的点为 A,最大的点为 B,现在小Y想要知道在每个点经过一次(A 点两次)的情况下从 A 走到 B,再回到 A 的最短路径。

但他是个强迫症患者,他有许多奇奇怪怪的要求与限制条件:

1.从 A 走到 B 时,只能由横坐标小的点走到大的点。

2.由 B 回到 A 时,只能由横坐标大的点走到小的点。

3.有两个特殊点 b1 和 b2, b1 在 0 到 n-1 的路上,b2 在 n-1 到 0 的路上。

请你帮他解决这个问题助他治疗吧!

【输入格式】

第一行三个整数 n,b1,b2,( 0 < b1,b2 < n-1 且 b1 ≠ b2)。n 表示点数,从 0 到 n-1 编号,b1 和 b2 为两个特殊点的编号。

以下 n 行,每行两个整数 x、y 表示该点的坐标(0 <= x,y <= 2000),从 0 号点顺序给出。Doctor Gao为了方便他的治疗,已经将给出的点按 x 增序排好了。

【输出格式】

输出仅一行,即最短路径长度(精确到小数点后面 2 位)

【输入样例】

5 1 3

1 3

3 4

4 1

7 5

8 3

【输出样例】

18.18

【数据规模】

20%的数据n<=20

60%的数据n<=300

100%的数据n<=1000

解析

这道题本蒟蒻做的时候写了个暴力,果不其然,TLE...

后来才知道原来这题是DP。

他是从A走到B再走回A,所以我们可以将问题转化为求两条和最小的不相交线段。

令f[i][j]表示从A到B的线段走到了i点,从B到A的线段走到了j点。

边界为:f[0][0]=0。

状态转移方程:(k=max(i,j))

k!=n-1时,

1、f[i][k]=min(f[i][k],f[i][j]+d(j,k));(k!=b1)

2、f[k][j]=min(f[k][j],f[i][j]+d(i,k));(k!=b2)

k==n-1时,

3、f[n-1][n-1]=min(f[n-1][n-1],f[i][n-1]+d(i,n-1));(i!=n-1)

4、f[n-1][n-1]=min(f[n-1][n-1],f[n-1][j]+d(j,n-1));(j!=n-1)

PS:由于是从0开始编号,所以最后一个点为n-1,当然,也可以全部+1从1开始编号(会更美观),主要看个人喜好。

Code

#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <queue>
using namespace std;
int read()
{
int num=,w=;
char ch=getchar();
while(ch<''||ch>'')
{
if(ch=='-') w=-;
ch=getchar();
}
while(ch>=''&&ch<='')
{
num=(num<<)+(num<<)+ch-'';
ch=getchar();
}
return num*w;
}
const int N=;
int n,b1,b2,k;
double f[N][N],x[N],y[N];
double d(int i,int j)
{
return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
}
int main()
{
//freopen("paths.in","r",stdin);
//freopen("paths.out","w",stdout);
memset(f,0x7f7f7f7f,sizeof(f));
f[][]=;
n=read(),b1=read(),b2=read();
for(int i=;i<n;i++) x[i]=read(),y[i]=read();
for(int i=;i<n;i++)
for(int j=;j<n;j++)
{
k=max(i,j);
if(k!=n-)
{
k++;
if(k!=b1) f[i][k]=min(f[i][k],f[i][j]+d(j,k));
if(k!=b2) f[k][j]=min(f[k][j],f[i][j]+d(i,k));
}
else
{
if(i!=n-) f[n-][n-]=min(f[n-][n-],f[i][n-]+d(i,n-));
if(j!=n-) f[n-][n-]=min(f[n-][n-],f[n-][j]+d(j,n-));
}
}
printf("%.2lf",f[n-][n-]);
return ;
//fclose(stdin);
//fclose(stdout);
}

T4 简单的序列

题目

【题目描述】

从前有个括号序列s,满足|s|=m。你需要统计括号序列对(p,q)的数量。

其中(p,q)满足|p|+|s|+|q|=n,且p+s+q是一个合法的括号序列。

【输入格式】

第一行两个正整数n,m。

第二行一个长度为m的括号序列,表示s。

【输出格式】

输出一行一个整数,表示符合条件的(p,q)的数量对10^9+7取模的值。

【输入样例】

4 1

(

【输出样例】

4

【数据规模】

对于10%的数据,n≤20;

对于25%的数据,n≤200;

对于另外5%的数据,n=m;

对于55%的数据,n-m≤200;

对于100%的数据,1≤m≤n≤10^5,n-m≤2000。

解析

这题有点意思,其实是一道DP题。

将'('转换为1,')'转换为-1。

令f[i][j]表示前i个括号总值为j(边界:f[0][0]=f[1][1]=1)。

而这里的j是一定不为负数的。为什么?因为若j为负数,就意味着当前右括号比左括号多,

这种情况即使后面加入左括号,就会变成“)(”这种情况,即右括号在左,左括号在右,很显然是不合法的。

所以初始赋值时,令f[i][0]=f[i-1][1],因为如果是f[i][0]=f[i-1][-1]的话就成了上面说的情况,不合法。

梳理了这么多,可以轻易推出状态转移方程:

1、f[i][j]=f[i-1][j-1](添加左括号)。

2、f[i][j]=f[i-1][j+1](添加右括号)。

Code

#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <queue>
using namespace std;
int read()
{
int num=,w=;
char ch=getchar();
while(ch<''||ch>'')
{
if(ch=='-') w=-;
ch=getchar();
}
while(ch>=''&&ch<='')
{
num=(num<<)+(num<<)+ch-'';
ch=getchar();
}
return num*w;
}
const long long mod=;
int n,m,temp,a[],minn=0x7f7f7f7f,ans;
long long f[][];
char s;
int main()
{
//freopen("bracket.in","r",stdin);
//freopen("bracket.out","w",stdout);
n=read(),m=read();
for(int i=;i<=m;i++)
{
cin>>s;
if(s=='(') a[++temp]=;
else a[++temp]=-;
}
f[][]=f[][]=;
for(int i=;i<=n-m;i++)
{
f[i][]=f[i-][];
for(int j=;j<=n-m;j++) f[i][j]=(f[i-][j-]+f[i-][j+])%mod;
}
temp=;
for(int i=;i<=m;i++)
{
temp+=a[i];
minn=min(minn,temp);
}
for(int i=-minn;i<=n-m;i++)
for(int j=-minn;j<=i;j++)
{
int l=n-m-i,b=temp+j;
if(b>=) ans=(long long)(f[l][b]*f[i][j]+ans)%mod;
}
cout<<ans;
return ;
//fclose(stdin);
//fclose(stdout);
}

长乐培训Day2的更多相关文章

  1. 常州培训 day2 解题报告

    第一题: 题目大意: 给出一个M面的骰子,投N次,求最大期望值. 最大期望值的定义: 比如M=2,N=2, 那么 2次可以是 1,1,最大值为1: 1,2最大值为2: 2,1最大值为2: 2,2 最大 ...

  2. 泉五培训Day2

    T1 旅游 题目 [题目描述] 幻想乡有n个景点(从1开始标号),有m条双向的道路连在景点之间,每条道路有一个人气值d,表示这条道路的拥挤程度.小G不会经过那些人气值大于x的道路,她想知道有多少对景点 ...

  3. 性能测试培训day2

    上节课 性能测试,多线程.协议.场景 实施:1,脚本开发 运行  排错(看回放,然后view-test_results,看业务) 参数化.关联.检查点.事务.思考时间.集合点 参数化:不做参数化的话, ...

  4. 长乐培训Day4

    T1 矩阵 题目 [题目描述] 从前有个 n×m 的矩阵,初始时每个位置均为 0.你需要依次执行 q 个操作,每个操作会指定一行或一列,然后将该行或该列的所有元素全部赋为一个相同的值. 输出操作完成后 ...

  5. 长乐培训Day9

    T1 立方数 题目 [题目描述] 作为XX战队的狂热粉丝,MdZzZZ看到了自己心仪的队伍在半决赛落败,顿时心灰意冷.看着自己手中的从黄牛那里抢来的天价总决赛门票,MdZzZZ觉得去鸟巢已经没有意义了 ...

  6. 长乐培训Day8

    T1 远征 题目 [题目描述] 寒枫将军将要带领他的部队去圣雪山消灭那里的冰龙.部队分成了若干个小队,属于同一个小队的人兵种相同. 寒枫将军有着杰出的指挥能力,在战斗的时候,寒枫将军能够让所有相同兵种 ...

  7. 长乐培训Day7

    T1 删除 题目 [题目描述] 现在,我的手上有 n 个数字,分别是 a1,a2,a3,...,an. 我现在需要删除其中的 k 个数字.当然我不希望随随便便删除,我希望删除 k 数字之后,剩下的 n ...

  8. 长乐培训Day6

    T1 数列 题目 [题目描述] [输入格式] [输出格式] [输入样例] [输出样例] [数据规模] 如上所述. 解析 身为T1,居然比T4还难......让我怎么办......以下为巨佬题解: 我猜 ...

  9. 长乐培训Day5

    T1 圆圈舞蹈 题目 [题目描述] 熊大妈的奶牛在时针的带领下,围成了一个圈跳舞.由于没有严格的教育,奶牛们之间的间隔不一致. 奶牛想知道两只最远的奶牛到底隔了多远.奶牛A到B的距离为A顺时针走和逆时 ...

随机推荐

  1. 中山纪中集训Day5叒是测试(划淼)

    A组T1 矩阵游戏(game) 九校联考24OI__D1T1 问题描述 LZK发明一个矩阵游戏,大家一起来玩玩吧,有一个N行M列的矩阵.第一行的数字是1,2,…M,第二行的数字是M+1,M+2…2*M ...

  2. 并发用户 VS TPS

    TPS模式(吞吐量模式)是一种更好的方式衡量服务端系统的能力. 基本概念: 并发用户数:简称VU ,指的是现实系统中操作业务的用户,在性能测试工具中,一般称为虚拟用户数(Virutal User),注 ...

  3. Mysql 查看所有线程,被锁的表等

    ## 查看所有MYSQl相关的线程 > show full processlist; ## 杀死线程id为2的线程 > kill 2 ## 查看服务器状态 > show status ...

  4. vue中样式被覆盖的问题

    在我们引入外部的样式时,发现自己无论如何都改不了外部的样式,自己的样式老被覆盖,究其原因还是我们的 外部样式放的位置不对 main.js 我们应该在 main.js 的开头引入样式,这样的话就不存在覆 ...

  5. sourceinsight4 用设置

    通用设置Options - File Type Options: 显示行号:勾选Show line mumbers选中自动高亮:勾选Hightlight references to selected ...

  6. maven仓库失效的情况下搭建maven项目

    maven仓库失效的情况下搭建maven项目 1,在有maven仓库的情况下mvn clean package 2,整个项目拷贝到没有的环境下 3,ls |xargs -t -I a cp a/pom ...

  7. Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression

    Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression 2019-05-20 19:3 ...

  8. 改变jupyter notebook的主题背景

     https://study.163.com/provider/400000000398149/index.htm?share=2&shareId=400000000398149( 欢迎关注博 ...

  9. c++异常——学习笔记

    1.异常 throw抛出字符串 最好的是:throw抛出对象. catch(...){} 2.使用标准异常类 #include<new> bitset 自己写一个异常 设计自己异常类 堆栈 ...

  10. Python3基础 运算 加减乘除、取余数

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...