D11
=-=感觉今天的题目好难...
主要是没有碰到过,所以会觉得不懂怎么写..
其实现在想想,T1,T2,T3其实都好水..T1其实没有做过还真不会,有做过的话就是个大水题了
T2找最小环..超级裸的,但是自己不会打=-=
T3直接FLOYD...+判断障碍物是否有在同一条线上
今天按理来说只有T4会比较难一些..DP+贪心
T1:模拟+数学思想
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int d,n,m,k,t;
int minx=123456,miny=123456,sum=123456;
int ansx[10001],ansy[10001],tot[1001][1001],a[100001],b[100001];
int main(){
freopen("manhattan.in","r",stdin);
freopen("manhattan.out","w",stdout);
scanf("%d%d",&d,&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i],&b[i]);
if(a[i]<minx) minx=a[i];
if(b[i]<miny) miny=b[i];
}
for(int i=1;i<=n;i++){
t=(a[i]-minx)%d+1;//这一段是关键
k=(b[i]-miny)%d+1;//就是%d看看是否要拆除
ansx[t]++;//记录个数
ansy[k]++;
tot[t][k]++;
}
for(int i=1;i<=d;i++)
for(int j=1;j<=d;j++){//横坐标上要拆的个数+纵坐标上的-重复算的
if(ansx[i]+ansy[j]-tot[i][j]<sum) sum=ansx[i]+ansy[j]-tot[i][j];
}
printf("%d",sum);
return 0;
}
T2:裸的最小环
网上的模板代码简直在逗我..坑死我了
后面翻了翻书,发现代码很简单明了的..
主要的部分是
for (int k=1; k<=n; ++k)
{
for (int i=1; i<k; ++i)
for (int j=i+1; j<k; ++j)
ans=Min(ans,f[i][j]+g[j][k]+g[k][i]);//个人感觉是在找环吧
for (int i=1; i<=n; ++i)
for (int j=1; j<=n; ++j)
if ((i!=j)&&(j!=k)&&(i!=k))
f[i][j]=Min(f[i][k]+f[k][j],f[i][j]);//FLOYD求最短路
}
自己略理解了一下..或许也不是特别正确吧
有时间好好的刷几题试试看好了
附上代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std; int g[1001][1001],f[1001][1001]; int Min(int a,int b) { return a<b?a:b; } int main ()
{
freopen("heart.in","r",stdin);
freopen("heart.out","w",stdout);
int n,m;
memset(g,27,sizeof(g));
memset(f,27,sizeof(f));
scanf("%d%d",&n,&m);
for (int i=1; i<=m; ++i)
{
int x,y;
scanf("%d%d",&x,&y);
scanf("%d",&g[x][y]);
g[y][x]=g[x][y];
f[x][y]=f[y][x]=g[x][y];
}
int ans=21474836;
for (int k=1; k<=n; ++k)
{
for (int i=1; i<k; ++i)
for (int j=i+1; j<k; ++j)
ans=Min(ans,f[i][j]+g[j][k]+g[k][i]);
for (int i=1; i<=n; ++i)
for (int j=1; j<=n; ++j)
if ((i!=j)&&(j!=k)&&(i!=k))
f[i][j]=Min(f[i][k]+f[k][j],f[i][j]);
}
if (ans==21474836)
printf("He will never come back.");
else printf("%d",ans);
fclose(stdin); fclose(stdout);
}
T3:floyd求最短路问题
其实这一题我看题的第一时间有想到求最短路问题,但是一想到要判断是否有障碍物这个细节,就各种不想打
=-=这应该算是我之前的一种烦躁的病吧...一定要改过来啊..
其实我要是真打起来的话,极有可能用DIJK..什么算法求最短路,上面的那个细节也不一定处理得正确->或许当时就是这么想的嗯!
看了别人的程序之后发现这里的细节处理非常简单:
for(int i=1;i<=m;i++){
scanf("%d%d",&x2,&y2);
for(int j=0;j<=n;j++)
for(int k=0;k<j;k++){
double a,b,c,d;
a=abs(x[j]-x[k]);
b=abs(y[j]-y[k]);
c=abs(x[j]-x2);
d=abs(y[j]-y2);
if((b/a==d/c) && Max(x[j],x[k])>=x2 && Min(x[j],x[k])<=x2 && Max(y[j],y[k])>=y2 && Min(y[j],y[k])<=y2)
dis[j][k]=dis[k][j]=INF;
}
}
在判断完斜率是否相等之后,看看那个障碍物是否在两个端点之间即可..
感觉这个方法很常用到..MARK一下..
附上完整代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int INF=123456789;
int x0,y0,n,m,x2,y2;
double dis[1001][1001];
int x[10001],y[10001];
int Min(int a,int b)
{
return a<b?a:b;
}
int Max(int a,int b)
{
return a<b?b:a;
}
int main(){
freopen("brazil.in","r",stdin);
freopen("brazil.out","w",stdout);
memset(dis,63,sizeof(dis));
scanf("%d%d%d%d",&x0,&y0,&n,&m);
for(int i=1;i<=n;i++){
scanf("%d%d",&x[i],&y[i]);
dis[i][0]=sqrt((x[i]-x0)*(x[i]-x0)+(y[i]-y0)*(y[i]-y0))*2;
for(int j=1;j<i;j++)
dis[i][j]=dis[j][i]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
}
for(int i=1;i<=m;i++){
scanf("%d%d",&x2,&y2);
for(int j=0;j<=n;j++)
for(int k=0;k<j;k++){
double a,b,c,d;
a=abs(x[j]-x[k]);
b=abs(y[j]-y[k]);
c=abs(x[j]-x2);
d=abs(y[j]-y2);
if((b/a==d/c) && Max(x[j],x[k])>=x2 && Min(x[j],x[k])<=x2 && Max(y[j],y[k])>=y2 && Min(y[j],y[k])<=y2)
dis[j][k]=dis[k][j]=INF;
}
}
for(int k=2;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=0;j<=n;j++){
if(i!=j && j!=k && i!=k)
dis[i][j]=Min(dis[i][j],dis[i][k]+dis[k][j]);
}
printf("%.0lf",dis[1][0]);
return 0; }
顺便提一下floyd的一个小地方..
我不懂为什么一直会忘记掉dis[i][j]记录的是第i个点到第j个点的距离=-=
不要有一天傻逼打错了嗯
T4:DP+贪心
=-=不知道这样的T4自己什么时候才能改完!
HPY都改完了!你居然连那个妹纸都不如!你就是个傻逼傻逼傻逼..
D11的更多相关文章
- D11——C语言基础学PYTHON
C语言基础学习PYTHON——基础学习D11 20180908内容纲要: 1.RabbitMQ消息队列 (1)RabbitMQ安装 (2)Rabbits示例 模式一:fanout 模式二:direct ...
- 预科班D11
2020.09.21星期一 预科班D11 学习内容: 一.基本数据类型及内置方法 1.整形int及浮点型float + - * / // ** % > < >= <= 2.字符 ...
- 正式班D11
2020.10.20星期二 正式班D11 bash解释器交互式环境特性 命令和文件自动补全(Tab只能补全命令和文件) 快捷键 CTRL+C ==>终止前台运行的程序 CTRL+D ==> ...
- 暑假集训D11总结
%dalao 今天某学长来讲一个极其高深的数据结构——线段树(woc哪里高深了),然而并没有时间整理笔记= =,所以明天在扔笔记咯= = 考试 今天考试,一看数据范围,woc暴力分给的真足,然后高高兴 ...
- D11 列表 list 元祖 字典dict
取值 name = "alexdfg" print(name[3:5]) 取出 ex name = "alexdfg" print(name[3]) 取出e 列 ...
- 《转载》PAT 习题
博客出处:http://blog.csdn.net/zhoufenqin/article/details/50497791 题目出处:https://www.patest.cn/contests/pa ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- PHP执行文档操作
1.POWINTPOINT系列 之前参与过一个商城的项目,里面有将excel 导出的功能,但是如果要弄成PPT的我们应该怎么办呢?PHP是属于服务器端的 总不能在里面装个Powintpoint吧.于是 ...
- CSS-学习笔记三
绝对定位:1. 脱离了文档流,没有浮动效果2. 默认情况下,设置了绝对定位的块,它的Top,left是相对于浏览器的3. 当给设置了绝对定位的块的父元素设置定位的时候(绝对.相对.固定), 那么 ...
随机推荐
- Android Fragment 真正彻底的解决(下一个)
转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/37992017 上篇博客中已经介绍了Fragment产生原因.以及一些主要的使用方 ...
- TCP流量控制协议
说明: 本文仅供学习交流.转载请标明出处,欢迎转载! 本文是下面文献相关内容的总结 [1] <TCP/IP具体解释 卷1:协议> [2] <TCP/IP协议族 第4版> [3] ...
- bash shell:重定向标准错误输出
如何重定向标准错误输出到标准输出?如何把标准错误输出输出到一个文件? Bash提供了I/O重定向工具,有3个缺省的文件(标准输出流): stdin - 用来获取输入,比如键盘.文件重定向 stdout ...
- Web字体@font-face对于中文字体的使用
今天算是刚开始玩博客园..感觉很新鲜在首页 上看到了一个博客http://www.cnblogs.com/liuminghai/p/4238256.html是关于web文字的,挺不错 但是B/S的前端 ...
- C++ Primer中文本查询演示样例Query的实现
近期在看C++ Primer复习C++的语法,看到书中15.9章中的文本查询演示样例时,认为设计得非常不错,于是便动手照着实现了一个,改动了非常久最终执行成功了,从中也学习到了非常多的语法.以下把实现 ...
- hadoop排序组合键的使用情况
于hadoop当处理复杂的业务,需要使用组合键,与单纯的复杂的继承Writable接口,但继承WritableComparable<T>接口.事实上.WritableComparable& ...
- Web文件(图片)上传方法
在开放Web应用程序的时候经常会遇到图片或者是文件上传的模块,这里就是该模块的实现的后台方法 上传图片方法 /// <summary> /// 功能:上传图片方法 /// </sum ...
- php 基础算法(用*表示金字塔)通过hash 比較两个数组同样的数
当作为一名php 程序猿,每天总与数据库打交道,做着最底层的程序猿的工作,開始着手研究一些算法,希望自己能在计算机的道路上走的更远.事实上我更喜欢管理,希望自己能作为一个卓越的管理者,但并不影响我对技 ...
- 程序员面试必备经典CTCI,谷歌面试官经典作品!
1.1 判断一个字符串中的字符是否唯一 1.2 字符串翻转 1.3 去除字符串中重复字符 1.8 利用已知函数判断字符串是否为另一字符串的子串 2.1 从链表中移除重复结点 2.2 实现一个算法从一个 ...
- JavaScript插件化开发
大熊君JavaScript插件化开发 一,开篇分析 Hi,大家好!大熊君又和大家见面了,还记得昨天的那篇文章吗------这个系列的开篇(第一季).主要讲述了以“jQuery的方式如何开发插件”, 那 ...