多第八田间学校:几何+图论出度+模拟+找到规律

HDU 4946 

pid=1002&cid=509" style="color:rgb(26,92,200); text-decoration:none; font-family:Tahoma; background-color:rgb(215,235,255)">Area
of Mushroom

这题WA了7发才过,队友做的,然后一起debug了好久。

刚開始是没排序。

然后是在同一个位置的点没有处理好。

然后把这两个问题搞定就A了。

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <ctype.h>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
#define eps 1e-10
#define INF 0x7fffffff
#define maxn 10005
#define PI acos(-1.0)
#define seed 31//131,1313
typedef long long LL;
typedef unsigned long long ULL;
using namespace std;
int x[505],y[505],v[505],vis[505];
int cmp(double x)
{
    if(fabs(x)<eps)
        return 0;
    if(x>0)
        return 1;
    return -1;
}
inline double sqr(double x)
{
    return x*x;
}
struct point//点
{
    double x,y;
    int pos;
    int o;
    point() {}
    point(double a,double b):x(a),y(b) {}
    void input()
    {
        scanf("%lf%lf",&x,&y);
    }
    friend point operator + (const point &a,const point &b)
    {
        return point(a.x+b.x,a.y+b.y);
    }
    friend point operator - (const point &a,const point &b)
    {
        return point(a.x-b.x,a.y-b.y);
    }
    friend bool operator == (const point &a,const point &b)
    {
        return cmp(a.x-b.x)==0 &&cmp(a.y-b.y)==0;
    }
    friend point operator * (const point &a,const double &b)
    {
        return point(a.x*b,a.y*b);
    }
    friend point operator * (const double &a,const point &b)
    {
        return point(a*b.x,a*b.y);
    }
    friend point operator / (const point &a,const double &b)
    {
        return point(a.x/b,a.y/b);
    }
    double norm()
    {
        return sqrt(sqr(x)+sqr(y));
    }//到原点距离
    void out () const
    {
        printf("%.2f %.2f",x,y);
    }
} p[505];
double det (const point &a,const point &b)
{
    return a.x*b.y-a.y*b.x;
}//叉积
double dot (const point &a,const point &b)
{
    return a.x*b.x+a.y*b.y;
}//点乘
double dist (const point &a,const point &b)
{
    return (a-b).norm();
}//距离
point rotate_point(const point &p,double A)
{
    double tx=p.x,ty=p.y;
    return point (tx*cos(A)-ty*sin(A),tx*sin(A)+ty*cos(A));
}//旋转,A是弧度
struct polygon_convex
{
    vector <point> P;
    polygon_convex(int size=0)
    {
        P.resize(size);
    }
} p_c;
bool comp_less(const point &a,const point &b)
{
    return cmp(a.x-b.x)<0||cmp(a.x-b.x)==0&&cmp(a.y-b.y)<0;
}
polygon_convex convex_hull(vector <point> a)
{
    polygon_convex res(2*a.size()+5);
    sort(a.begin(),a.end(),comp_less);
    a.erase(unique(a.begin(),a.end()),a.end());
    int m=0;
    for(int i=0; i<a.size(); i++)
    {
        while(m>1 && cmp(det(res.P[m-1]-res.P[m-2],a[i]-res.P[m-2]))<0)
            m--;
        res.P[m++]=a[i];
    }
    int k=m;
    for(int i=int(a.size())-2; i>=0; i--)
    {
        while(m>k && cmp(det(res.P[m-1]-res.P[m-2],a[i]-res.P[m-2]))<0)
            m--;
        res.P[m++]=a[i];
    }
    res.P.resize(m);
    if(a.size()>1)
        res.P.resize(m-1);
    return res;
}
bool cmp3(point a,point b)
{
    return a.x<b.x||((a.x==b.x)&&(a.y<b.y));
}
int main()
{
    int T,tt=0;
    while(scanf("%d",&T))
    {
        tt++;
        vector<point>pp;
        pp.clear();
        memset(vis,0,sizeof(vis));
        if(T==0)
            break;
        int pos=-1;
        int max_v=0;
        for(int i=1; i<=T; i++)
        {
            scanf("%d%d%d",&x[i],&y[i],&v[i]);
            if(v[i]>max_v)
                max_v=v[i];
        }
        int top=0;
        for(int i=1; i<=T; i++)
        {
            if(v[i]==max_v)
            {
                p[top].x=(double)x[i];
                p[top].y=(double)y[i];
                p[top].pos=i;
                p[top].o=0;
                top++;
            }
        }
        printf("Case #%d: ",tt);
        if(max_v==0)
        {
            for(int i=1; i<=T; i++)
                printf("0");
            printf("\n");
            continue;
        }
        sort(p,p+top,cmp3);
        for(int i=0; i<top; i++)
        {
            if((i<top-1&&(p[i].x)==(p[i+1].x)&&(p[i].y)==(p[i+1].y))||(i>0&&(p[i].x)==(p[i-1].x)&&(p[i].y)==(p[i-1].y)))
                p[i].o=1;
        }
        pp.push_back(p[0]);
        for(int i=1; i<top; i++)
        {
            if(p[i].x!=p[i-1].x||p[i].y!=p[i-1].y)
                pp.push_back(p[i]);
        }
        if(pp.size()<=3)
        {
            for(int i=0; i<pp.size(); i++)
                if(pp[i].o==0)
                    vis[pp[i].pos]=1;
        }
        else
        {
            polygon_convex ans=convex_hull(pp);
            for(int i=0; i<ans.P.size(); i++)
            {
                //cout<<ans.P[i].ok<<" "<<ans.P[i].pos<<endl;
                if(ans.P[i].o==0)
                    vis[ans.P[i].pos]=1;
            }
        }
        for(int i=1; i<=T; i++)
            printf("%d",vis[i]);
        printf("\n");
    }
    return 0;
}
/*
3
2 2 3
2 2 3
2 3 3
6
1 1 3
1 -1 3
2 0 3
-1 1 3
-1 -1 3
-2 0 3
4
1 1 1
1 2 1
1 3 1
1 4 1
15
1 1 0
1 1 1
2 1 1
3 1 1
4 1 1
5 1 1
5 2 1
5 3 1
5 4 1
4 4 1
3 4 1
2 4 1
1 4 1
1 3 1
1 2 1
9
1 4 1
1 3 1
1 2 1
1 1 1
2 1 1
3 1 1
4 1 1
3 2 1
2 3 1
*/

HDU 4948 Kingdom

这题比赛的时候遗憾了。我看了这道题。然后认为挺简单的。

刚開始一看题上,想到的就是拓扑排序。然后脑子想啊想……感觉就是拓扑排序的逆序。然后发现挺水的……

由于说了要想发展某个城市的话,就必须有还有一个城市作为它发展的前提,即城市u->w这样连边,表示要想发展城市w,前提是u已经是发展过的城市了。那这种话不是非常easy嘛。

即统计出出度最多的就是第一个要发展的城市了。由于u->w这样连边能够看出算出出度最多的依次从大到小排序即可了。

哎呀。只是可惜了。由于看见没人交这题。然后也不敢把自己想的告诉队友,然后自己也没敲……然后错过进第一版的机会了真是被第一梯队的带错路被坑了……

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<cmath>
#include<bitset>
#define mem(a,b) memset(a,b,sizeof(a))
#define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define llson j<<1,l,mid
#define rrson j<<1|1,mid+1,r
#define INF 0x7fffffff
#define maxn 11010
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
char s[500][505];
struct abc
{
    int i,out;
    bool operator<(const abc &a)const
    {
        return out>a.out;
    }
}a[501];
int main()
{
    //freopen("1.txt","r",stdin);
    int n,i,j;
    while(scanf("%d",&n)&&n)
    {
        for(i=0;i<n;i++)
            scanf("%s",s[i]),a[i].i=i,a[i].out=0;
        for(i=0;i<n;i++)
            for(j=0;j<n;j++)
                if(s[i][j]=='1')
                    a[i].out++;
        sort(a,a+n);
        printf("%d",a[0].i+1);
        for(i=1;i<n;i++)
            printf(" %d",a[i].i+1);
        puts("");
    }
    return 0;
}

HDU 4951 Multiplication table

乘法表。

看每行。两个数都相等的就是0了。

然后看第一位不相等的个数,多少个不同就是哪个数了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<cmath>
#include<bitset>
#define mem(a,b) memset(a,b,sizeof(a))
#define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define llson j<<1,l,mid
#define rrson j<<1|1,mid+1,r
#define INF 0x7fffffff
#define maxn 11010
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int a[511][1011],vis[511];
int main()
{
    //freopen("1.txt","r",stdin);
    int n,i,j,ii=1;
    while(scanf("%d",&n)&&n)
    {
        int flag,b[512];
        for(i=0; i<n; i++)
        {
            for(j=0,flag=0; j<n; j++)
            {
                scanf("%d%d",&a[i][j<<1],&a[i][j<<1|1]);
                if(a[i][j<<1]!=a[i][j<<1|1]) flag++;
            }
            if(!flag) b[0]=i;
        }
        for(i=0;i<n;i++)
        {
            if(i==b[0]) continue;
            mem(vis,0);
            int sum=0;
            for(j=0;j<(n<<1);j+=2)
                if(!vis[a[i][j]]) sum++,vis[a[i][j]]=1;
            b[sum]=i;
        }
        printf("Case #%d: %d",ii++,b[0]);
        for(i=1;i<n;i++)
            printf(" %d",b[i]);
        puts("");
    }
    return 0;
}

HDU 4952 

pid=1008&cid=509" style="color:rgb(26,92,200); text-decoration:none; font-family:Tahoma; background-color:rgb(215,235,255)">Number
Transformation

这题规律题,输出前面100个值与倍数就会发现往后的倍数都是一样的了,倍数一样就是每次都加同样的数到最后,这种话就变成简单的乘法了。

代码中凝视的三句就是用来找规律的。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<cmath>
#include<bitset>
#define mem(a,b) memset(a,b,sizeof(a))
#define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define INF 10000010
#define maxn 80010
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int main()
{
    ll n,m;
    int ans=1;
    while(scanf("%I64d%I64d",&n,&m)&&(n||m))
    {
        //int cnt=0;
        ll a=-1,b=-1,sum=0,i;
        int flag=0;
        for(i=2LL;i<=m;i++)
        {
            if(n%i)
            {
                b=n/i+1LL;
                n=b*i;
                //if(cnt++<100)
                //cout<<"+++ "<<n<<' '<<(int)(n/i)<<' '<<i<<endl;
                if(b==a) break;
                else a=b;
                flag=1;
            }
        }
        if(flag&&i<m)
        {
            sum=m-i;
            sum=sum*a+n;
        }
        else sum=n;
        printf("Case #%d: %I64d\n",ans++,sum);
    }
    return 0;
}
时间: 2024-08-07 19:07:09

多第八田间学校:几何+图论出度+模拟+找到规律的相关文章

多校第八场:图论出度

HDU 4948 这题比赛的时候遗憾了,我看了这道题,然后觉得挺简单的. 刚开始一看题上,想到的就是拓扑排序,然后脑子想啊想--感觉就是拓扑排序的逆序,然后发现挺水的-- 因为说了要想发展某个城市的话,就必须有另一个城市作为它发展的前提,即城市u->w这样连边,表示要想发展城市w,前提是u已经是发展过的城市了.那这样的话不是很简单嘛. 即统计出出度最多的就是第一个要发展的城市了,因为u->w这样连边可以看出算出出度最多的依次从大到小排序就行了. 哎呀,不过可惜了,因为看见没人交这题,然后也不敢

靠二进制画几何[图论]

今天来浅谈一下图,听说自己写总结的人grade++,rp++. 像我这样可爱的人怎么能错过这个机会呢嘤嘤嘤. 毕竟图至少啃了15day++. 恩曾经的小弱渣从来都是仰望高端玩家虐图论 听说noip上一年考两道大图(つд⊂)而小弱渣还没学到 吓得本宝宝虎躯一震!! 恩废话不多说,来开正文. -------------------我是萌哒哒的分割线-------------------- 刚开始先学图的储存. 邻接矩阵 邻接矩阵就是跟二维数组长得一毛(mu)一样奇奇怪怪的东xi 1 #include

Ogre参考手册(八)4 几何网格(Mesh)工具

4 网格(Mesh)工具 4.1 导出 导出工具是3D模型工具的插件,用于将网格和骨骼动画写入Ogre可以使用的文件格式.导出文件扩展名为.mesh(网格)和.skeleton(骨骼). 每个导出工具单独为模型工具编写,同时共用公共的类MeshSerializer和SkeletonLizer. 所有导出工具都可从源代码构建,你也可以直接从Ogre网站下载预编译的版本 Ogre动画说明 1 每个顶点不能超过四个骨骼权重.如果超过了4个,Ogre将消除较小的权重并重新标量化剩下的权重.这一限制是因为

简单几何(线段相交)+模拟 POJ 3449 Geometric Shapes

题目传送门 题意:给了若干个图形,问每个图形与哪些图形相交 分析:题目说白了就是处理出每个图形的线段,然后判断是否相交.但是读入输出巨恶心,就是个模拟题加上线段相交的判断,我第一次WA不知道输出要按字母序输出,第二次WA是因为忘记多边形的最后一条线段,还好找到了,没有坚持的话就不会AC了. /************************************************ * Author :Running_Time * Created Time :2015/10/31 星期六

UVA 10010- Where&#39;s Waldorf?(八方向寻找字符串)

Where's Waldorf? Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Description  Where's Waldorf?  Given a m by n grid of letters, ( ), and a list of words, find the location in the grid at which the word can be foun

洛谷 P1219 八皇后【经典DFS,温习搜索】

P1219 八皇后 题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 5来描述,第i个数字表示在第i行的相应位置有一个棋子,如下: 行号 1 2 3 4 5 6 列号 2 4 6 1 3 5 这只是跳棋放置的一个解.请编一个程序找出所有跳棋放置的解.并把它们以上面的序列方法输出.解按字典顺序排列.请输出前3个解.最后一行是解的总个数. //以下的

对八皇后的补充以及自己解决2n皇后问题代码

有了上次的八皇后的基础.这次准备解决2n皇后的问题,: //问题描述// 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.//同一列或同一条对角线上,任意的两个白皇后都不在同一行.同一列或同一条对角线上.问总共有多少种放法?n小于等于8.//输入格式// 输入的第一行为一个整数n,表示棋盘的大小.// 接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇

java爬虫爬取学校毕设题目

背景 效果 思路 代码准备 依赖(jar包): 建表 代码 java爬虫过程解析 如何解决分页问题 背景 最近很多大四学生问我毕业设计如何选题 “你觉得图书管理系统怎么样?” “导师不让做这个,说太简单” “那你觉得二手交易平台怎么样?” “导师说没新意,都有咸鱼了你做这个有什么意思?要新颖的” “那你觉得个人博客平台的搭建怎么样?” “啥是博客?” “emmmm……在线售票怎么样?” “导师说今年不让选xx管理系统,这些都太简单” “那你觉得做人脸识别或者垃圾自动分类怎么样” “导师说这些太难

当程序员的那些狗日日子

作此文,祭奠我当程序员的那些狗日日子,并与所有仍在艰苦奋斗着的同行共勉. 这里所说的是"我"当程序员的那些狗日日子,但我绝对没有说别人当程序员是狗日日子.在这里我也并没有贬低"程序员"这个职业和这个群体的意思,我只是想写出我的职业经历和表达出我的感受.所以希望您可以带着平常心去看,只当看一个小程序员的职业故事,如果您看后没有骂我,那我就已经感到很欣慰了! ──作者序 (一)毕业后的徘徊 我不是计算机相关专业毕业的,我上的是大专,我的专业叫供用电技术,是跟电力行业相关