zoukankan      html  css  js  c++  java
  • 2017XDU初赛网络赛

    链接:http://acm.xidian.edu.cn/contest.php?cid=1028


    问题 C: 大大数星星

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 1928  解决: 655
    [提交][状态][讨论版]

    题目描述

    喜欢数星星真是个传染病,这一天大大和大嫂晚上走在路上抬头看到很多星星,他们发现星星密密麻麻的布满了整个天空,大嫂说她想用线将天空的星星分割开,但是只给大大n根无限长的直线!大大为了让大嫂开心,想问问你最多能把星星分割成多少份!

    输入

    读入多组数据,处理到文件结束为止!(不超过5000组)
    每组数据一个整数n(0<=n<=10000000)

    输出

    对于每组输出一个整数,表示最多分割的份数。

    样例输入

    0
    1
    2
    

    样例输出

    1
    2
    4
    

    提示

    请使用六十四位整数,%lld


    推导出公式,套公式即可:

    #include <iostream>
    #include <cstdio>
    using namespace std;
    typedef long long ll;
     
    int main()
    {
        ll a;
        while(~scanf("%lld",&a)) {
            ll ans = 1 + a*(a+1)/2;
            printf("%lld
    ",ans);
        }
        return 0;
    }

    问题 D: 善良的大红

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 1302  解决: 628
    [提交][状态][讨论版]

    题目描述

    大红知道学弟学妹做题可能很辛苦,特地准备了一道小点心,你看到这道题目会不会有点熟悉呢?

    输入一个整数n(n>=1 && n <=26),输出如下的n层字母三角形。

    具体参看输入输出样例。

    输入

    多组数据,每行一个正整数,n(n>=1 && n <= 26)

    请处理到文件结束。

    输出

    对于每一个输入的正整数,打印对应的字母三角形。注意每行的空格哦,当n==26时,最后一行行首恰好没有空格。

    样例输入

    1
    2
    3
    

    样例输出

                             A
                             A
                            ABA
                             A
                            ABA
                           ABCBA

    打印图形:

    import java.util.*;
    public class Main {
            public static void main(String[] args) {
                Scanner sc = new Scanner(System.in);
                while(sc.hasNext()){
                int a = sc.nextInt();
                int m,n;
    //          System.out.println(a);
                for(int q = 1; q <= a; q++) {
                     
                    int cnt = 26 - q;
                    for(int k = 1; k <= cnt; k++) {
                        System.out.print(" ");
                    }
                    m = 0;
                    for(int j = cnt+1; j <= 26; j++) {   
                         
                        System.out.print((char)('A'+m));
                        m++;
                    }
                    n = q-2;;
                    for(int t = 1; t < q; t++) {
                        System.out.print((char)('A'+n));
                        n--;
                    }
                    System.out.println();
                }
            }
    }
    }



    问题 E: 虢莔薅参加运动会

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 2800  解决: 480
    [提交][状态][讨论版]

    题目描述

    又到了金色的春天,一年一度的运动会就要来了,虢莔薅同学是班里的体育委员,于是他早早的就订好了运动会的时候和女朋友出去玩的计划!不对,是刷题的计划!但是今天他的导员找到了他,让他作为班级代表参加10项比赛!虢莔薅听了说:“这会死的!”,导员哈哈大笑说:“多吃点高钙片就好了”。经过了1个小时的激烈争论,两人终于达成协议,只要导员做出虢莔薅出的题虢莔薅就参加,否则就让他去刷题!于是虢莔薅说出了题:求sum(i^2)%p,1<=i<=n,p是一个素数。(sum表示求和,%表示求余)为了班级的荣誉,你快帮帮导员做出这个题吧!

    输入

    多组数据处理到文件结束。(不超过50组)
    每行一组数据,包含两个正整数n(1<=n<=10^15),p(2<=p<=10^9)。

    输出

    对于每组数据,输出一个数,表示sum(i^2)%p的值

    样例输入

    1 7
    2 11
    3 13
    

    样例输出

    1
    5
    1

    典型大数运算,如果卡时间怎么破:

    import java.util.*;
    import java.math.*;
    import java.text.*;
    public class Main {
            public static void main(String[] args) {
                Scanner sc = new Scanner(System.in);
                while(sc.hasNext()){
                    BigInteger a = sc.nextBigInteger();
                    BigInteger b = sc.nextBigInteger();
                    BigInteger ans = a.multiply(a.add(BigInteger.valueOf(1))).multiply(a.multiply(BigInteger.valueOf(2)).add(BigInteger.valueOf(1))).divide(BigInteger.valueOf(6)).mod(b);
                    System.out.println(ans.toString());
                }
            }
    }

    问题 G: 锘爷考驾照

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 1762  解决: 415
    [提交][状态][讨论版]

    题目描述

    大家都知道,锘爷是XDUdp第一人,所以锘爷决定要去考驾照!(这很有逻辑吧),他为了一次考到驾照,于是买了一辆越野车从学校开回家来练习开车,在途中就会有很多高山和低谷(低谷可能比地平面低)。经过一段时间的调查,现在他已经知道了最短的路线,我们假设这是一条直线,并且他一定会走这条直线。但是这也太远了,锘爷想找一段开车的时间打瞌睡,为了更舒服的打瞌睡,于是锘爷统计了这条路线上所有的山峰和谷底的高度,他想知道长度为length的路上高度之和最小的一段是多少?

    输入

    多组数据(不超过50组),处理到文件结束。
    对于每组数据,读入一个整数n,length(1<=length<=n<=200000)n表示山峰和低谷数,length表示诺爷打瞌睡的长度。
    接下来是n个整数h(i),表示高度,abs(h(i))<=200000。

    输出

    对于每组数据,输出一个整数表示长度为length高度和的最小值。

    样例输入

    3 2
    1 2 3
    5 3
    1 -1 -1 2 -5
    

    样例输出

    3
    -4

    注意看清题目,暴力不是dp,EOF结束:

    #include <iostream>
    #include <cstdio>
     
    using namespace std;
    int n;
    const int INF_MAX = 0x3f3f3f3f;
     
    int main() {
        int len;
        while(~scanf("%d%d",&n,&len)) {
        int a[n];
        for(int i = 0; i < n; i++) {
            scanf("%d",&a[i]);
        }
        int sum = 0;
        for(int i = 0; i < len; i++) {
            sum+=a[i];
        }
        int tmp = sum;
        for(int i = len; i < n; i++) {
            sum+=a[i];
            sum-=a[i-len];
            if(sum<tmp)
                tmp = sum;
        }
        cout<<tmp<<endl;
        }
    }


    问题 J: V8与女友

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 1240  解决: 254
    [提交][状态][讨论版]

    题目描述

    那是遥远的公元前2333年,V8还有女朋友的时代。

    他和他的女友分别是两个距离遥远的部落的首领,那时候没有现在发达的交通工具和路网,V8每次希望团圆的时候,都要跋山涉水不远万里去会见他的爱人,辛酸的很。经过很多次的旅途,V8掌握了他可以走的所有的路的路线图,毕竟作为首领,不能离开自己的领地太久,所以V8希望你给他找出一条最近的路,并且输出一次往返所需要的最短时间,V8并不会在对方领地停留,说个你好就回来了,需要的时间为0。

    虽然不管你求出来有多快,最终V8还是觉得自己在路上花费的时间太多,选择了舍小家而为大家(手动滑稽。

    输入

    第一行一个正整数t,表示数据的组数(t <=10)。

    之后对于每组数据,第一行一个正整数k,表示这个地图(无向图)的路径数(k<=10000)。

    之后有k行,每一行三个正整数,s,t,v。表示路的两个端点和这条路需要的时间(s,t,v <=100)。

    第k+1行为两个数,v,m,表示V8和他爱人的所在地。

    输出

    对于每组数据,输出一行一个正整数,为V8一个来回最短的时间(数据保证有通路)。

    样例输入

    1
    4
    1 2 1
    1 3 1
    2 4 2
    3 4 1
    1 4
    

    样例输出

    4

    dij特斯拉,双向图,结果*2即可:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    using namespace std;
    const int maxn = 2000+5;
    int mp[maxn][maxn];
    int vis1[maxn];
    int vis2[maxn];
    int dis1[maxn];
    int dis2[maxn];
    const int inf = 0x3f3f3f3f;
    int main()
    {
        //freopen("in.txt","r",stdin);
        int T;
        cin>>T;
        while(T--) {
            int m;
            cin>>m;
            memset(dis1,inf,sizeof(dis1));
    //        memset(dis2,inf,sizeof(dis2));
            for(int i = 1; i < maxn; i++) {
                for(int j = 1; j < maxn; j++) {
                        if(i==j) mp[i][j] = 0;
                        else mp[i][j] = inf;
                }
            }
            int a,b,c;
            while(m--) {
     
                cin>>a>>b>>c;
                mp[a][b] = mp[b][a] = c;
            }
            int Maxn = max(a,b);
            int s,e;
            cin>>s>>e;
            for(int i = 1; i <= Maxn; i++) {
                    dis1[i] = mp[s][i];
                    vis1[i] = 0;
    //                dis2[i] = mp[e][i];
     
                }
            vis1[s] = 1;
    //        vis2[e] = 1;
    //        int Min2 = inf;
            int u1;
    //        int u2;
            for(int i = 1; i <= Maxn; i++) {
                int Min1 = inf;
                for(int j = 1; j <= Maxn; j++) {
                    if(!vis1[j]&&dis1[j]<Min1) {
                        u1=j;
                        Min1 = dis1[j];
                    }
    //                if(!vis2[j]&&dis2[j]<=Min2) {
    //                    u2 = j;
    //                    Min2 = dis2[j];
    //                }
                }
                vis1[u1] = 1;
    //            vis2[u2] = 1;
                for(int j = 1; j <= Maxn; j++) {
                    if(!vis1[j]&&dis1[j]>mp[u1][j]+dis1[u1])
                        dis1[j] = mp[u1][j]+dis1[u1];
    //                if(!vis2[j]&&dis2[j]>mp[u2][j]+dis2[u2])
    //                    dis2[j] = mp[u2][j]+dis2[u2];
                }
            }
            cout<<dis1[e]*2<<endl;
        }
        return 0;
    }

    问题 F: 统计相似字符串

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 1742  解决: 259
    [提交][状态][讨论版]

    题目描述

    给N个字符串,请将他们以相同的组成元素(即组成的元素种类相同,每种元素的个数也一样)来分类,分类后按照原本出现的顺序输出!

    输入

    多组数据,最多100组数据,每组最多N<5000个字符串,每个字符串长度最多|s|<=8,保证都是小写字母

    输出

    输出多行,每行为同一类别的字符串组

    样例输入

    6
    eat tea tan ate nat bat
    

    样例输出

    eat tea ate
    tan nat
    bat
    字符串处理:


    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    int n;
    const int maxn = 5000+5;
     
    int cmp(char a,char b) {
    return a < b;
    }
    int flag[maxn];
    struct Node {
        char s[10];
        int id;
        }node1[maxn],node2[maxn];
     
    int main() {
    //   freopen("in.txt","r",stdin);
       int n;
       while(cin>>n) {
       memset(node1,0,sizeof(node1));
       memset(node2,0,sizeof(node2));
       memset(flag,0,sizeof(flag));
       for(int i = 0; i < n; i++) {
            scanf("%s",node1[i].s);
            node1[i].id = i;
            node2[i] = node1[i];
            sort(node1[i].s,node1[i].s+strlen(node1[i].s),cmp);
       }
            for(int i = 0; i < n; i++) {
                if(flag[i]) continue;
                printf("%s",node2[i].s);
                for(int j = i+1; j < n; j++) {
                    if(!strcmp(node1[j].s,node1[i].s)) {
                        printf(" %s",node2[j].s);
                        flag[j] = 1;
                    }
                }
                        cout<<endl;
     
            }
       }
        return 0;
    }

    问题 B: 笑爷买房

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 1035  解决: 243
    [提交][状态][讨论版]

    题目描述

    笑爷打算在北京三环买一套房。

    现在笑爷手上有一些房源的户型图,她想知道每套房屋的室内面积是多少。
    房屋的墙壁由'#'表示,一平方米的地面由一个'*'表示。请统计被墙壁包围住的地面面积是多少平方米。

    输入

    一个由#和*组成的字符矩阵,行列数均不超过50。(不一定是矩形)

    输出

    输出房屋有多少平方米并换行。

    样例输入

    #*#######
    ##******#
    *#######*

    样例输出

    6

    典型BFS:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <queue>
    using namespace std;
    const int MAXN = 52;
     
    int xx[4] = {1, 0 ,-1, 0}, yy[4] = {0, 1, 0, -1}, n = 0, m, imax = 0;
    char g[MAXN][MAXN];
    struct Qarray {
        int x, y;
        Qarray(int xx, int yy) {
            x = xx;
            y = yy;
        }
    };
    queue<Qarray> que;
     
    void bfs(int i, int j) {
        int f = 1, res = 0;
        Qarray ns(i,j);
        que.push(ns);
        g[i][j] = '#';
        while (!que.empty()) {
            res++;
            ns = que.front();
            que.pop();
            if (ns.x == 0 || ns.x == n-1 || ns.y == 0 || ns.y == m-1)
                f = 0;
            for(int k = 0; k < 4; k++) {
                int xi = ns.x+xx[k], yi = ns.y+yy[k];
                if (g[xi][yi] == '*') {
                    que.push(Qarray(xi, yi));
                    g[xi][yi] = '#';
                }
            }
        }
        if (f) imax += res;
    }
     
    int main() {
        //freopen("in.txt", "r", stdin);
        while(~scanf("%s", g[n]))
            n++;
        m = strlen(g[0]);
        for(int i = 1; i < n-1; i++)
            for(int j = 1; j < m-1; j++)
                if (g[i][j] == '*')
                    bfs(i, j);
        printf("%d
    ", imax);
        return 0;
    }

    问题 H: 杰师傅与锘爷

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 699  解决: 186
    [提交][状态][讨论版]

    题目描述

    震惊!XDUACM实验室中想起了啪啪啪的声音,杰师傅在一旁沉默。这声音不是键盘声,而是鼠标声!“你萌别打dota了,快去刷题”杰师傅大喊,但是他看了一眼被吓到的锘爷,于是妥协了,就给锘锘出了一道游戏比赛,让锘爷开心。这个是一个回合制游戏,有两群orz熊猫分别为a,b只,每一回合,锘爷和杰师傅轮流进行操作,每次操作可以kill掉s个第一群orz熊猫,或者kill掉t个第二群orz熊猫,其中1<=s<=c,1<=t<=d。最终谁取不了,算谁输!(即就是轮到某个人取了,但是两堆都是0个,无法操作)有爱心的杰师傅决定让锘爷先手,那么请你告诉锘爷他是否能赢,能赢的话输出“NUO!”,不能的话输出“NO!”,没有引号。杰师傅和锘爷绝对聪明,有必胜策略的话,他们不会失误!

    输入

    多组数据(不超过100组),处理到文件结束。
    每组数据一行,四个整数a,b,c,d,1<=c<=a<=1000, 1<=d<=b<=1000

    输出

    对于每组数据输出一行,锘爷能赢的话输出“NUO!”,不能的话输出“NO!”,没有引号。

    样例输入

    1 1 1 1
    3 2 1 2

    样例输出

    NO!
    NUO!

    典型巴什博弈:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <queue>
    using namespace std;
    const int MAXN = 52;
     
    int main() {
        int a, b, c, d;
        while(~scanf("%d%d%d%d", &a, &b, &c, &d)) {
            if ((a%(c+1)) != (b%(d+1))) printf("NUO!
    ");
            else printf("NO!
    ");
        }
        return 0;
    }

    问题 A: 大红数星星

    时间限制: 3 Sec  内存限制: 128 MB
    提交: 1066  解决: 67
    [提交][状态][讨论版]

    题目描述

    “三角形十分的美丽,相信大家小学就学过三角形具有稳定性,三角形也是二维几何中最基本的必不可少的元素之……”,大红走在路上若有所思,突然抬头看到了天空中有很多很亮的星星划过,星星和他们划过的轨迹像极了一个无向图。于是好学的大红,就开始数起了“三角形”,1、2、3……数了好久,大红数的眼泪都掉下来了,所以他哭着请求你来帮他,你这么好心一定不会拒绝吧!大红的三角形的定义:如果存在这样的三个边(A,B)、(B,C)、(A,C)(无向边),则算一个三角形。
    大红会告诉你这个图G=(V,E),点数(星星个数)n和边数(轨迹个数)m以及每条边的两个点。

    两个三角形不同是:当对于两个三角形的边,某个三角形存在一条边在另一个三角形的边中无法找到!

    输入

    多组数据。
    第一行一个整数T<=10表示数据组数。
    对于每组数据的第一行n表示星星个数,m表示星星划过的轨迹的个数,
    接下来m行表示每个星星划过的轨迹的端点x,y(1<=x,y<=n)。
    1<=n<=100000,1<=m<=min(100000,n*(n-1)/2)

    输出

    对于每组数据输出一个整数,表示三角形的个数。

    样例输入

    1
    3 3
    1 2
    2 3
    1 3
    

    样例输出

    1

    提示

    保证数据没有重边和自环。

    压轴题,卡时间,技巧暴力:

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int maxn = 1e5 + 5;
    const int hash_base = 1000007;
    int n, m, cur;
    struct node{
        LL data;
        int next;
    }list[hash_base];
    int table[hash_base];
     
    int get_hash(int u, int v) {
        LL h = ((LL)u)*n+v;
        return (int)(h%hash_base);
    }
     
    void insert(int u, int v) {
        int h = get_hash(u, v);
        list[cur].data = ((LL)u)*n+v;
        list[cur].next = table[h];
        table[h] = cur;
        cur++;
    }
     
    bool find_edge(int u, int v) {
        LL h = ((LL)u)*n+v;
        int k = get_hash(u, v);
        int q = table[k];
        while(q != -1) {
            if(list[q].data == h) return true;
            q = list[q].next;
        }
        return false;
    }
     
    void in(int &a) {
        char ch;
        while((ch=getchar()) < '0' || ch > '9');
        for(a = 0; ch >= '0' && ch <= '9'; ch = getchar())
            a = a*10 + ch - '0';
    }
     
    vector<int>G[maxn];
    int d[maxn];
     
    bool is_ok(int u, int v) {
        if(find_edge(u, v) || find_edge(v, u)) return true;
        return false;
    }
     
    int main() {
        int T;
        scanf("%d", &T);
        while(T--) {
            memset(d, 0, sizeof(d));
            cur = 0;
            for(int i = 0; i <= hash_base; ++i) {
                table[i] = -1;
                list[i].next = -1;
            }
            scanf("%d%d", &n, &m);
            for(int i = 1; i <= n; ++i) G[i].clear();
            int u, v;
            for(int i = 0; i < m; ++i) {
                in(u); in(v);
                G[u].push_back(v);
                G[v].push_back(u);
                d[v]++;
                d[u]++;
                insert(u, v);
            } 
            int ans = 0, div = sqrt(m);
            int p[maxn], cnt = 0;
            for(int i = 1; i <= n; ++i) {
                if(d[i] <= div) {
                    for(int j = 0; j < G[i].size(); ++j) if(i <= G[i][j] || d[G[i][j]] > div)
                        for(int k = j+1; k < G[i].size(); ++k) if(G[i][k] >= i || d[G[i][k]] > div){
                            u = G[i][j], v = G[i][k];
                            if(is_ok(u, v)) ans++;
                        }
                }
                else p[cnt++] = i;
            }
            for(int i = 0; i < cnt; ++i)
                for(int j = i+1; j < cnt; ++j) if(is_ok(p[i], p[j]))
                    for(int k = j+1; k < cnt; ++k) {
                        if(is_ok(p[i], p[k]) && is_ok(p[j], p[k])) ans++;
                    }
            printf("%d
    ", ans);
        }
        return 0;
    }


  • 相关阅读:
    Python合集之文件操作(二)
    Python合集之文件操作(一)
    Python合集之异常(二)
    Python合集之异常(一)
    Python合集之模块(五)
    Visual Studio 配置额外工具 Windows Terminal 等
    CMakeList.txt
    alpha智能图像(全栈的进阶之路)
    位运算实现多状态控制
    缓存函数 memorize
  • 原文地址:https://www.cnblogs.com/zhangmingzhao/p/7256623.html
Copyright © 2011-2022 走看看