zoukankan      html  css  js  c++  java
  • $NOIP 2015 Day1$ 模拟考试题解报告

    (NOIP 2015 Day1) 模拟考试题解报告

    得分情况

    (T1 100 Pts)

    (T2 100 Pts)

    (T3 100 Pts)

    总分: (300 Pts)

    考试过程

    三道题都做过

    十分钟过 (T1) 二十分钟过 (T2) 三十分钟过 (T3)

    然后写对拍... 挨个模 (T1)(T2) ... 算 (T3) ... 等等... 到结束


    题解

    (T1) 神奇的幻方

    模拟

    代码

    /*
      Time: 6.20
      Worker: Blank_space
      Source:
    */
    /*--------------------------------------------*/
    #include<cstdio>
    /*--------------------------------------头文件*/
    inline void File() {
    	freopen("magic.in", "r", stdin);
    	freopen("magic.out", "w", stdout);
    }
    /*----------------------------------------文件*/
    int n, x, y, mp[50][50];
    /*------------------------------------变量定义*/
    inline int read() {
    	int x = 0, f = 1; char ch = getchar();
    	while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();}
    	while(ch >= '0' && ch <= '9') {x = (x << 3) + (x << 1) + (ch ^ 48); ch = getchar();}
    	return x * f;
    }
    /*----------------------------------------快读*/
    
    /*----------------------------------------函数*/
    int main() {
    	File();
    	n = read(); y = (n >> 1) + 1; x = 1; mp[x][y] = 1;
    	for(int i = 0; i <= n + 1; i++) mp[0][i] = mp[i][0] = mp[n + 1][i] = mp[i][n + 1] = 1;
    	for(int i = 2; i <= n * n; i++)
    	{
    		if(x == 1 && y != n) x = n, y++, mp[x][y] = i;
    		else if(x != 1 && y == n) y = 1, x--, mp[x][y] = i;
    		else if(x == 1 && y == n) x++, mp[x][y] = i;
    		else if(x != 1 && y != n)
    			if(!mp[x - 1][y + 1]) x--, y++, mp[x][y] = i; else x++, mp[x][y] = i;
    	}
    	for(int i = 1; i <= n; i++) {for(int j = 1; j <= n; j++) printf("%d ", mp[i][j]); puts("");}
    	return 0;
    }
    
    

    (T2) 信息传递

    拓扑跑一遍 没走到过的搜一遍 统计数量即可

    代码

    /*
      Time: 6.20
      Worker: Blank_space
      Source:
    */
    /*--------------------------------------------*/
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #define Abs(x) ((x) < 0 ? -(x) : (x))
    #define Max(x, y) ((x) > (y) ? (x) : (y))
    #define Min(x, y) ((x) < (y) ? (x) : (y))
    #define Swap(x, y) ((x) ^= (y) ^= (x) ^= (y))
    /*--------------------------------------头文件*/
    const int B = 2e5 + 7;
    const int mod = 1e9 + 7;
    const int INF = 0x3f3f3f3f;
    /*------------------------------------常量定义*/
    inline void File() {
    	freopen("message.in", "r", stdin);
    	freopen("message.out", "w", stdout);
    }
    /*----------------------------------------文件*/
    int n, in[B], cnt, ans = INF;
    struct edge {int v, nxt;} e[B];
    int head[B], ecnt;
    std::queue <int> q;
    bool vis[B];
    /*------------------------------------变量定义*/
    inline int read() {
    	int x = 0, f = 1; char ch = getchar();
    	while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();}
    	while(ch >= '0' && ch <= '9') {x = (x << 3) + (x << 1) + (ch ^ 48); ch = getchar();}
    	return x * f;
    }
    /*----------------------------------------快读*/
    void add_edge(int u, int v) {e[++ecnt] = (edge){v, head[u]}; head[u] = ecnt;}
    void dfs(int u) {
    	vis[u] = 1; cnt++;
    	for(int i = head[u]; i; i = e[i].nxt) if(!vis[e[i].v]) dfs(e[i].v);
    }
    /*----------------------------------------函数*/
    int main() {
    //	File();
    	n = read();
    	for(int i = 1, x; i <= n; i++) x = read(), add_edge(i, x), in[x]++;
    	for(int i = 1; i <= n; i++) if(!in[i]) q.push(i);
    	while(!q.empty())
    	{
    		int u = q.front(); q.pop(); vis[u] = 1;
    		for(int i = head[u]; i; i = e[i].nxt)
    		{
    			int v = e[i].v; in[v]--;
    			if(!in[v]) q.push(v);
    		}
    	}
    	for(int i = 1; i <= n; i++) if(!vis[i]) dfs(i), ans = Min(ans, cnt), cnt = 0;
    	printf("%d", ans);
    	return 0;
    }
    /*
    7
    2 4 2 3 1 7 6
    
    */
    

    (T3) 斗地主

    搜索

    代码

    /*
      Time: 6.20
      Worker: Blank_space
      Source: 
    */
    /*--------------------------------------------*/
    #include<cstdio>
    #define Min(x, y) ((x) < (y) ? (x) : (y))
    /*--------------------------------------头文件*/
    const int A = 1e4 + 7;
    const int B = 1e5 + 7;
    const int C = 1e6 + 7;
    const int D = 1e7 + 7;
    const int mod = 1e9 + 7;
    const int INF = 0x3f3f3f3f;
    /*------------------------------------常量定义*/
    inline void File() {
    	freopen("landlords.in", "r", stdin);
    	freopen("landlords.out", "w", stdout);
    }
    /*----------------------------------------文件*/
    int T, n, s[20], ans;
    /*------------------------------------变量定义*/
    inline int read() {
    	int x = 0, f = 1; char ch = getchar();
    	while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();}
    	while(ch >= '0' && ch <= '9') {x = (x << 3) + (x << 1) + (ch ^ 48); ch = getchar();}
    	return x * f;
    }
    /*----------------------------------------快读*/
    void f1(int l, int r, int k) {for(int i = l; i <= r; i++) s[i] += k;}
    void dfs(int t) {
    	if(t >= ans) return ;
    	int z = 0;
    	for(int i = 3; i <= 14; i++)
    	{
    		if(s[i]) z++; else z = 0;
    		if(z >= 5) {f1(i - z + 1, i, -1); dfs(t + 1); f1(i - z + 1, i, 1);}
    	}
    	z = 0;
    	for(int i = 3; i <= 14; i++)
    	{
    		if(s[i] > 1) z++; else z = 0;
    		if(z >= 3) {f1(i - z + 1, i, -2); dfs(t + 1); f1(i - z + 1, i, 2);}
    	}
    	z = 0;
    	for(int i = 3; i <= 14; i++)
    	{
    		if(s[i] > 2) z++; else z = 0;
    		if(z >= 2) {f1(i - z + 1, i, -3); dfs(t + 1); f1(i - z + 1, i, 3);}
    	}
    	for(int i = 2; i <= 14; i++) if(s[i] >= 3)
    	{
    		s[i] -= 3;
    		for(int j = 2; j <= 15; j++) if(s[j]) {s[j]--; dfs(t + 1); s[j]++;}
    		for(int j = 2; j <= 14; j++) if(s[j] > 1) {s[j] -= 2; dfs(t + 1); s[j] += 2;}
    		s[i] += 3;
    	}
    	for(int i = 2; i <= 14; i++) if(s[i] >= 4)
    	{
    		s[i] -= 4;
    		for(int j = 2; j <= 15; j++) if(s[j])
    		{
    			s[j]--;
    			for(int k = 2; k <= 15; k++) if(s[k]) {s[k]--; dfs(t + 1); s[k]++;}
    			s[j]++;
    		}
    		for(int j = 2; j <= 14; j++) if(s[j] > 1)
    		{
    			s[j] -= 2;
    			for(int k = 2; k <= 14; k++) if(s[k] > 1) {s[k] -= 2; dfs(t + 1); s[k] += 2;}
    			s[j] += 2;
    		}
    		s[i] += 4;
    	}
    	for(int i = 2; i <= 15; i++) if(s[i]) t++;
    	ans = Min(ans, t);
    }
    void clear() {ans = INF; for(int i = 2; i <= 15; i++) s[i] = 0;}
    void work() {//A 14 王 15
    	for(int i = 1; i <= n; i++)
    	{
    		int x = read(), y = read();
    		if(x == 1) s[14]++;
    		else if(!x) s[15]++;
    		else s[x]++;
    	}
    	dfs(0);
    	printf("%d
    ", ans);
    }
    /*----------------------------------------函数*/
    int main() {
    	File();
    	T = read(); n = read(); while(T--) clear(), work();
    	return 0;
    }
    
    
  • 相关阅读:
    mysqldump详解
    mysql忽略表中的某个字段不查询
    mysqldumpslow基本使用
    xtrabakcup基本用法 安装、全量备份恢复、增量备份恢复
    Ubuntu--磁盘统计
    Ubuntu--硬盘的挂载与卸载
    Ubuntu--文件属性权限管理(command: chmod, chown)
    Ubuntu--useradd指令使用
    Ubuntu--安装sshd开启远程登陆服务
    Ubuntu--虚拟机中Ubuntu系统时间与windows不同步
  • 原文地址:https://www.cnblogs.com/blank-space-/p/14906736.html
Copyright © 2011-2022 走看看