LightOJ-1008-Fibsieve`s Fantabulous Birthday [规律]

来源:互联网 发布:上瘾网络剧台湾未删减 编辑:程序博客网 时间:2024/05/20 00:09

题目传送门


题意:给定一个图表,求第n个数的坐标。

思路:规律题,1 * 1的方阵最外层为1,2 * 2的方阵最外层为[2,4], 3 * 3的方阵最外层为[5,9],可知n*n的方阵最外层为[(n-1)^2+1,n^2]。可求出第N个数所在的最大方阵的行数和列数,根据行数的奇偶判断是先行后列还是先列后行增加,然后根据N与对角线的比较得到行号列号。

#include <bits/stdc++.h>using namespace std;struct node{    int to, next;}edge[201000];int head[100000+1000], cnt;int num[2], vis[20100];void add(int u, int v){    edge[cnt].to = v;    edge[cnt].next = head[u];    head[u] = cnt++;}void dfs(int x, int stp){    vis[x] = 1;    num[stp]++;    for (int i = head[x]; i; i=edge[i].next)    {        int v = edge[i].to;        if (!vis[v])        {            dfs(v, stp^1);        }    }    return ;}int main(void){    int T, cas=1;    scanf("%d", &T);    while (T--)    {        int n;        memset(head, 0, sizeof(head));        memset(vis, 1, sizeof(vis));        cnt = 1;        scanf("%d", &n);        while (n--)        {            int x, y;            scanf("%d %d", &x, &y);            add(x,y);            add(y,x);            vis[x] = 0;            vis[y] = 0;        }        int ans =0 ;        for (int i = 1; i <= 20000; i++)        {            if (!vis[i])            {                memset(num, 0, sizeof(num));                dfs(i, 0);                ans += max(num[1], num[0]);            }        }        printf("Case %d: %d\n", cas++, ans);    }    return 0;}
阅读全文
0 0
原创粉丝点击