matrix_world_final_2011
C http://acm.hust.edu.cn/vjudge/contest/view.action?cid=98613#problem/C
题意:输入16进制的n*m矩阵,其在二进制表示下有6种图中的哪几种。
解法:6种图黑点都是连通的,所以第一步先把黑的连通块标号,第二步6种图中白连通块的个数正好是0-5个,第二步每找到一个白块就找到它的边界,对应的黑块+1,最后每一个黑块中有多少白块就统计完了,按字典序输出即可。
//#define debug
//#define txtout
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<cctype>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
const double eps=1e-;
const double pi=acos(-1.0);
const int inf=0x3f3f3f3f;
const int M=2e2+;
char a[M][M];
char str[]="WAKJSD";
bool black[M][M];
int index_of_black;
int id[M][M];
int dx[]={,,,-};
int dy[]={,-,,};
int n,m;
int sum[];
int count_of_black[M*M];
int id_of_black;
vector<char> answer;
int to_int(char c){
if(isdigit(c)) return c-'';
return c-'a'+;
}
void init_black(){
for(int i=;i<n;i++){
int len=;
for(int j=;j<m;j++){
int value=to_int(a[i][j]);
for(int k=;k>=;k--){
black[i][len++]=(value>>k)&;
}
}
}
m<<=;
}
void init_id(){
for(int i=;i<n;i++){
for(int j=;j<m;j++){
id[i][j]=;
}
}
}
void init_count_of_black(){
for(int i=;i<=index_of_black;i++){
count_of_black[i]=;
}
}
bool inside(int x,int y){
return x>=&&x<n&&y>=&&y<m;
}
void dfs_black(int x,int y,int Index){
id[x][y]=Index;
for(int i=;i<;i++){
int tx=x+dx[i];
int ty=y+dy[i];
if(!inside(tx,ty)) continue;
if(!black[tx][ty]) continue;
if(id[tx][ty]) continue;
dfs_black(tx,ty,Index);
}
}
void solve_black(){
index_of_black=;
for(int i=;i<n;i++){
for(int j=;j<m;j++){
if(!black[i][j]) continue;
if(id[i][j]) continue;
dfs_black(i,j,++index_of_black);
}
}
}
void dfs_white(int x,int y){
id[x][y]=-;
for(int i=;i<;i++){
int tx=x+dx[i];
int ty=y+dy[i];
if(!inside(tx,ty)){
id_of_black=;
continue;
}
if(id[tx][ty]){
if(id[tx][ty]>&&id_of_black==-){
id_of_black=id[tx][ty];
}
continue;
}
dfs_white(tx,ty);
}
}
void solve_white(){
for(int i=;i<n;i++){
for(int j=;j<m;j++){
if(id[i][j]) continue;
id_of_black=-;
dfs_white(i,j);
if(id_of_black==) continue;
count_of_black[id_of_black]++;
}
}
}
void solve(){
init_black();
init_id();
solve_black();
init_count_of_black();
solve_white();
mt(sum,);
for(int i=;i<=index_of_black;i++){
sum[count_of_black[i]]++;
}
answer.clear();
for(int i=;i<;i++){
for(int j=;j<sum[i];j++){
answer.push_back(str[i]);
}
}
sort(answer.begin(),answer.end());
}
int main(){
#ifdef txtout
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int cas=;
while(~scanf("%d%d",&n,&m),n|m){
for(int i=;i<n;i++){
scanf("%s",a[i]);
}
solve();
printf("Case %d: ",cas++);
int len=answer.size();
for(int i=;i<len;i++){
putchar(answer[i]);
}
puts("");
}
return ;
}
K http://acm.hust.edu.cn/vjudge/contest/view.action?cid=98613#problem/K
题意:求最小的能让任意多边形垂直下落通过的间距。
解法:先做凸包,求凸包的宽度即是答案。
//#define debug
//#define txtout
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<cctype>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
const double eps=1e-;
const double pi=acos(-1.0);
const int inf=0x3f3f3f3f;
const int M=1e2+;
struct point {
double x,y;
} p[M],res[M];
int n;
char buffer[M];
class Convex_Hull { ///凸包
bool mult(point sp,point ep,point op) { ///>包括凸包边上的点,>=不包括。
return (sp.x-op.x)*(ep.y-op.y)>=(ep.x-op.x)*(sp.y-op.y);
}
static bool cmp(const point &a,const point &b) { ///整数不需fabs,a.y==b.y。
return a.y<b.y||(fabs(a.y-b.y)<eps&&a.x<b.x);
}
public:
int Graham(int n,point p[],point res[]) { ///传入点的个数,点数组p[],凸包点存在res[],返回凸包点数.
sort(p,p+n,cmp);
if(n==) return ;
res[]=p[];
if(n==) return ;
res[]=p[];
if(n==) return ;
res[]=p[];
int top=;
for(int i=; i<n; i++) {
while(top&&mult(p[i],res[top],res[top-])) {
top--;
}
res[++top]=p[i];
}
int len=top;
res[++top]=p[n-];
for(int i=n-; i>=; i--) {
while(top!=len&&mult(p[i],res[top],res[top-])) {
top--;
}
res[++top]=p[i];
}
return top;
}
} gx;
class Convex_Hull_Wide{///凸包的宽
double xmult(point p1,point p2,point p0) { ///计算向量叉积(P1-P0)x(P2-P0)
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
double Square(double x) { ///平方
return x*x;
}
double Distance(point a,point b) { ///平面两点距离
return sqrt(Square(a.x-b.x)+Square(a.y-b.y));
}
double get(point a,point b,point c){
return fabs(xmult(a,b,c));
}
public:
double Rotate_Calipers_Wide(point p[],int n) {///传入凸包和点数
double result=-;
for(int i=,j=; i<n; i++) {
while(get(p[j+],p[i+],p[i])>get(p[j],p[i+],p[i])){
j=(j+)%n;
}
double temp=get(p[j],p[i+],p[i])/Distance(p[i],p[i+]);
if(result==-){
result=temp;
continue;
}
result=min(result,temp);
}
return result;
}
}ts;
void round_up(double &x){
sprintf(buffer,"%.6f",x);
int len=strlen(buffer);
for(int i=;i<len;i++){
if(buffer[i]=='.'){
if(buffer[i+]!=''){
buffer[i+]='';
}
break;
}
}
sscanf(buffer,"%lf",&x);
}
double solve() {
int len=gx.Graham(n,p,res);
double result=ts.Rotate_Calipers_Wide(res,len);
round_up(result);
return result;
}
int main() {
#ifdef txtout
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int cas=;
while(~scanf("%d",&n),n) {
for(int i=; i<n; i++) {
scanf("%lf%lf",&p[i].x,&p[i].y);
}
printf("Case %d: %.2f\n",cas++,solve());
}
return ;
}
end
matrix_world_final_2011的更多相关文章
随机推荐
- php读取excel文件 更新修改excel
php读取excel文件示例,还有更新修改功能. 代码: //模板存放目录 $dir = $DOCUMENT_ROOT.'/backoffice/admin/oemcheck/'; $template ...
- Head First-策略模式
策略模式,什么是策略模式,定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户. 下面我们就用鸭子来诠释一下策略模式,鸭子有两种行为呱呱叫和飞,但是并不是所有的鸭 ...
- mysql 导入导出数据库、数据表
Linux下 均在控制台下操作. 导入数据库: 前提:数据库和数据表要存在(已经被创建) (1)将数据表 test_user.sql 导入到test 数据库的test_user 表中 [root@te ...
- C++ 里 构建动态二维数组
//****动态二维数组 /* int m=3; int **data; int n=2; data=new int*[m]; for(int j=0;j<m;j++) { data[j]=ne ...
- java作用域public ,private ,protected 及不写时的区别(转)
在说明这四个关键字之前,我想就class之间的关系做一个简单的定 义,对于继承自己的class,base class可以认为他们都是自己的子 女,而对于和自己一个目录下的classes,认为都是自己的 ...
- 淘宝:OceanBase分布式系统负载均衡案例分享
Heroku因"随机调度+Rails单线程处理导致延迟增加的负载均衡失败"的案例之后,我们在思考:在负载均衡测试时发现问题并妥善解决的成功经验有没有?于是,挖掘出"淘宝在 ...
- JavaScrip拖动动画中的常见BUG
经常我们在用JS辛苦写完一个拖动效果之后 ,发现有各种无法用JS解决的BUG.比如拖动时DOM元素中的内容会变蓝,鼠标的指示会变为一个小+号,或disable的样式,通常这种情况一发生,我们的拖动效果 ...
- JS中的DOM与BOM
javascript组成: 1. ECMAScript 基本语法. 2. BOM (浏览器对象模型) 3. DOM (文档对象模型) 一)BOM(borwser Object Model) 浏览器对 ...
- Linux下安装宋体以及微软雅黑字体
最近工作用itext生成pdf在windows环境下没有出现中文乱码而在linux下出现中文乱码,打开pdf查看pdf编码,以及显示的编码,发现编码并没有对应.原因是使用的宋体和微软雅黑在linux环 ...
- 【js类库AngularJs】web前端的mvc框架angularjs之hello world
AngularJS诞生于2009年,由Misko Hevery 等人创建,后为Google所收购.是一款优秀的前端JS框架,已经被用于Google的多款产品当中.AngularJS有着诸多特性,最为核 ...