码迷,mamicode.com
首页 > 其他好文 > 详细

被教育场45

时间:2018-06-10 23:02:53      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:int   main   快速   等于   结束   inpu   style   lse   while   

ABC略

C爆int,从20min一直调到70min,然后放弃,结束时改了long来了一发然后AC,,多了200++罚时很难受。1100-1800。

D题非常简单(但是我一直在肝C。。。)

题意:求一个具有n个顶点的图,该图有a个联通块,该图的补图有b个联通块。

离散都学了,,然而我都睡过去了导致很懵逼,看了好久才注意到这样一个事情: 补图的联通块的个数等于原图中度数为n-1的顶点的个数加一

然后我们很容易就能发现 a>=2&&b>=2 时是无解的。那么就只剩下3种情况。

1.a==1&&b==1

  首先注意到 n=1,2,3这种特殊情况。剩下的只要按顺序连点就可以(i-i+1相连)。

2.a==1&&b>1(用if-else的话后面的b我就懒得写了)

  那么我们首先先让b-1个点都是完全点(我也不知道怎么称呼,就是与其他每个点都有边),然后就不用管了。。。

3.a>1&&b==1

  先让a-1个点独立。剩下的连起来就完事了。

 

前面的是快速IO。。。

正在努力向c++转变,,,

 

package R45;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.StringTokenizer;

public class Main4 {
    static BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer tok;
    static boolean hasNext()
    {
        while(tok==null||!tok.hasMoreTokens())
            try{
                tok=new StringTokenizer(in.readLine());
            }
            catch(Exception e){
                return false;
            }
        return true;
    }
    static String next()
    {
        hasNext();
        return tok.nextToken();
    }
    static long nextLong()
    {
        return Long.parseLong(next());
    }
    static int nextInt()
    {
        return Integer.parseInt(next());
    }
    static PrintWriter out=new PrintWriter(new OutputStreamWriter(System.out));


    static int n;
    static int g[][];
    public static void main(String[] args) {
        n = nextInt();
        int a = nextInt();
        int b = nextInt();
        g = new int[n+1][n+1];
        if (a>=2&&b>=2){
            out.println("NO");
            out.flush();
            return;
        }else if (a==1&&b==1){
            if (n==1){
                out.println("YES");
                out.println(0);
            }else if (n<=3){
                out.println("NO");
            }else {
                out.println("YES");
                for(int i=2;i<=n;i++){
                    g[i-1][i]=1;
                    g[i][i-1]=1;
                }
                syso();
            }
        }else {
            out.println("YES");
            if (a==1){
                for(int i=1;i<=b-1;i++){
                    for(int j=1;j<=n;j++){
                        if (i!=j) {
                            g[i][j] = 1;
                            g[j][i] = 1;
                        }
                    }
                }
                syso();
            }else {//b==1
                //先挑出来a-1个单独的点,剩下的随,随意?
                for(int i=a;i<=n;i++){
                    for(int j=a;j<=n;j++){
                        if (i!=j)
                            g[i][j]=g[j][i]=1;
                    }
                }
                syso();
            }
        }
        out.flush();
    }
    public static void syso(){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                out.print(g[i][j]);
            }
            out.println();
        }
    }
}

 

被教育场45

标签:int   main   快速   等于   结束   inpu   style   lse   while   

原文地址:https://www.cnblogs.com/MXang/p/9164599.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!