----------------------------------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
5
-DWWD
L-WLL
DD-WD
DDL-L
DDLL-
1
说明
对于 40%的数据,满足 N<=20
对于 100%的数据,满足 N<=50
思路=A=
大模拟,如果主场赢了就+=3,输了就让另一个+=3(写成++,蠢哭了qaq),如果平局就双方++
代码酱=u=
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
inline int read() {
int x=0,f=1;char c=getchar();
while(c<'0' || c>'9') { if(c=='-') f=-1; c=getchar(); }
while('0'<=c && c<='9') x=x*10+c-'0',c=getchar();
return x*f;
}
const int N = 60;
int n;
struct points {
int id,w;
points() { w=0; }
bool operator < (const points &qwq ) const {
return w > qwq.w;
}
} p[N];
int main() {
freopen("soccer.in","r",stdin);
freopen("soccer.out","w",stdout);
n=read();
char c;
for(int i=1; i<=n; i++) {
p[i].id=i;
for(int j=1; j<=n; j++) {
cin>>c;
if(c=='-') continue;
else if(c=='W') p[i].w+=3;
else if(c=='D') p[i].w++,p[j].w++;
else if(c=='L') p[j].w+=3;
}
}
sort(p+1,p+1+n);
int x=p[1].w;
for(int i=1; i<=n; i++) {
if(p[i].w<x) break;
printf("%d ",p[i].id);
}
fclose(stdin);fclose(stdout);
return 0;
}
----------------------------------------------------------------------
Ps:接下来就是单纯存个题=v=
----------------------------------------------------------------------
----------------------------------T2----------------------------------
——>最短路径
题目描述
平面内给出 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
对于所有数据 x,y,b1,b2 如题目描述.
T代码(暴力)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include <iostream>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstdlib>
using namespace std;
inline int read() {
int x=0,f=1;char c=getchar();
while(c<'0' || c>'9') { if(c=='-') f=-1; c=getchar(); }
while('0'<=c && c<='9') x=x*10+c-'0',c=getchar();
return x*f;
}
const int N = 1015;
int n,AB,BA,t;
double ans=1e8,jl[N][N];
bool vis[N];
struct point {
int x,y;
} P[N];
double getjl(int a,int b) {
int x=P[a].x,y=P[a].y,x2=P[b].x,y2=P[b].y;
double p=max(x-x2,x2-x),q=max(y-y2,y2-y);
p*=p;q*=q;
return sqrt(p+q);
}
void dfs(int now,int cnt,double nowl) {
if(nowl>ans) return;
if(now!=0) vis[now]=true;
if(now==n-1 && cnt==1) {
if(!vis[AB]) return;
dfs(now,2,nowl);
}
if(now==0 && cnt==2) {
for(int i=1; i<n; i++) if(!vis[i]) return;
if(ans>nowl) {
ans=nowl;
return;
}
}
if(cnt==1) {
for(int i=now+1; i<n; i++) {
if(!vis[i] && i!=BA) {
dfs(i,1,nowl+jl[now][i]);
vis[i]=false;
}
}
}
else {
for(int i=now-1; i>=0; i--) {
if(!vis[i] && i!=AB) {
dfs(i,2,nowl+jl[now][i]);
vis[i]=false;
}
}
}
}
int main() {
freopen("paths.in","r",stdin);
freopen("paths.out","w",stdout);
n=read();AB=read();BA=read();
for(int i=0; i<n; i++)
P[i].x=read(),P[i].y=read();
for(int i=0; i<n; i++)
for(int j=0; j<n; j++) {
if(i==j) continue;
jl[i][j]=getjl(i,j);
}
dfs(0,1,0.00);
printf("%.2lf",ans);
fclose(stdin);fclose(stdout);
return 0;
}
----------------------------------T3----------------------------------
——>阿 Q 的停车场
题目描述
刚拿到驾照的 KJ 总喜欢开着车到处兜风,玩完了再把车停到阿 Q 的停车场里,虽然她对自己停车的水平很有信心,
但她还是不放心其他人的停车水平,尤其是 Kelukin。
于是,她每次都把自己的爱车停在距离其它车最远的一个车位。
KJ 觉得自己这样的策略非常科学,于是她开始想:
在一个停车场中有一排车位,从左到右编号为 1 到 n,初始时全部是空的。
有若干汽车,进出停车场共 m 次。
对于每辆进入停车场的汽车,会选择与其它车距离最小值最大的一个车位,若有多个符合条件,选择最左边一个。
KJ 想着想着就睡着了,在她一旁的 Kelukin 想帮她完成这个心愿,但是他又非常的懒,不愿意自己动手,于是就把这个问题就留给了你:
在 KJ 理想的阿 Q 的停车场中,给你车辆进出的操作序列,依次输出每辆车的车位编号。
输入输出格式
输入格式:
第一行,两个整数 n 和 m,表示停车场大小和操作数;
接下来 m 行,每行两个整数 F 和 x
F 是 1 表示编号为 x 的车进停车场;
F 是 2 表示编号为 x 的车出停车场;
保证操作合法,即:
出停车场的车一定目前仍在停车场里;
停车场内的车不会超过 n;
输出格式:
对于所有操作 1,输出一个整数,表示该车车位的编号。
输入输出样例
7 11
1 15
1 123123
1 3
1 5
2 123123
2 15
1 21
2 3
1 6
1 7
1 8
1
7
4
2
7
4
1
3
说明
对 30%的数据 n<=1000 ,m<=1000
对 60%的数据 n<=200000,m<=2000
对 100%的数据 n,m<=200000,车的编号小于等于 10^6
T代码(暴力)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
inline int read() {
int x=0,f=1;char c=getchar();
while(c<'0' || c>'9') { if(c=='-') f=-1; c=getchar(); }
while('0'<=c && c<='9') x=x*10+c-'0',c=getchar();
return x*f;
}
const int C = 100015;
const int M = 200025;
int n,m,F,x,now;
int q[M];
bool vis[C];
struct car {
int id,w;
} a[M];
int main() {
freopen("park.in","r",stdin);
freopen("park.out","w",stdout);
n=read();m=read();
while(m--) {
F=read();x=read();
if(F==1) {
a[now].id=x;
memset(q,0,sizeof(q));
int top=0,w=1;
for(int i=1; i<=n; i++)
if(vis[i]) q[top++]=i;
for(int i=1,Min,Max=0; i<=n; i++) {
if(vis[i]) continue;
Min=M;
for(int j=0,y; j<top; j++) {
y=max(i-q[j],q[j]-i);
if(y<Min) Min=y;
}
if(Max<Min) Max=Min,w=i;
}
vis[w]=true;
a[now++].w=w;
printf("%d\n",w);
}
else {
int id;
for(int i=0; i<n; i++)
if(a[i].id==x) {
id=a[i].w;
break;
}
vis[id]=false;
}
}
fclose(stdin);fclose(stdout);
return 0;
}