Codeforces 201A Clear Symmetry

解题思路:要你构造一个01正方形矩阵,矩阵需要满足1不能相邻,且矩阵对称,给你一个n ,问你包含n个1的最小正方形矩阵边长为多少。

解题思路:1和3的情况需要特殊考虑,只有奇数可以实现这样的摆放 ,枚举奇数,把奇数矩阵分成4块求最大可放置矩阵。

解题代码:

 1 // File Name: 201a.cpp
 2 // Author: darkdream
 3 // Created Time: 2015年03月10日 星期二 20时15分18秒
 4
 5 #include<vector>
 6 #include<list>
 7 #include<map>
 8 #include<set>
 9 #include<deque>
10 #include<stack>
11 #include<bitset>
12 #include<algorithm>
13 #include<functional>
14 #include<numeric>
15 #include<utility>
16 #include<sstream>
17 #include<iostream>
18 #include<iomanip>
19 #include<cstdio>
20 #include<cmath>
21 #include<cstdlib>
22 #include<cstring>
23 #include<ctime>
24 #define LL long long
25
26 using namespace std;
27 int dp[105];
28 int mx[105];
29 int main(){
30    int n ;
31    scanf("%d",&n);
32    dp[1] = 1;
33    dp[2] = 3;
34    dp[4] = 3;
35    dp[5] = 3;
36    for(int i = 5;i <= 30;i +=2)
37    {
38        int  t = i /2;
39        mx[i] = (t/2)*4 + 1;
40        int k ;
41        if(t % 2 == 0 )
42           k= t*t *2;
43        else
44           k=((t/2+1)*(t/2+1) + (t/2)*(t/2))*4;
45        mx[i] +=k;
46        for(int j =1 ;j <= min(mx[i],100) ;j ++)
47        {
48            if(dp[j] == 0 )
49            {
50                dp[j] = i ;
51            }
52        }
53    }
54    printf("%d\n",dp[n]);
55 return 0;
56 }

时间: 2024-12-21 20:02:26

Codeforces 201A Clear Symmetry的相关文章

codeforces 201A A. Clear Symmetry(数论+构造)

题目链接: codeforces 201A 题目大意: 给出一个x,求一个边长最小的正方形矩阵,这个矩阵是01矩阵,且满足元素上下对称,左右对称,问构造出1的个数是x的矩阵最小的边长是多少. 题目分析: 首先我们能够发现若n-1构造的最大数比n构造出的最大数要大(n为偶数时). 然后我们知道对于每个奇数,能够构造出的最大数是n2+12 然后对于每个正方形矩阵,在横中轴线和纵中轴线的点都是两两一组,同生同灭,两条中轴线交点的自己一组,那么我们发现如果对于小于当前矩阵最大数的数x,一定能够通过去掉4

Codeforces 903F Clear The Matrix(状态压缩DP)

题目链接 Clear The Matrix 题意 给定一个$4 * n$的矩形,里面的元素为'.'或'*'.现在有4种正方形可以覆盖掉'*',正方形的边长分别为$1,2,3,4$. 求把整个矩形变成全'.'的最小代价. 考虑状压DP 设$f[i][j]$为前$i$列已经全部变成'.',第$i + 1$到第$i + 4$列的这$16$个格子状态为$j$的最小花费. 这$16$个格子标号如下 0   4   8   12 1   5   9   13 2   6  10  14 3   7  11 

Concise and clear CodeForces - 991F(dfs 有重复元素的全排列)

就是有重复元素的全排列 #include <bits/stdc++.h> #define mem(a, b) memset(a, b, sizeof(a)) using namespace std; typedef long long LL; const int maxn = 10010, INF = 0x7fffffff; char str[maxn]; int vis[maxn], v[maxn]; LL num[maxn]; LL res = 0; void init() { num[0

CodeForces 396A 数论 组合数学

题目:http://codeforces.com/contest/396/problem/A 好久没做数论的东西了,一个获取素数的预处理跟素因子分解写错了,哭瞎了,呵呵, 首先ai最大值为10^9,n为500,最坏的情况 m最大值为500个10^9相乘,肯定不能获取m了,首选每一个ai肯定是m的一个因子,然后能分解就把ai给分解素因子,这样全部的ai都分解了  就能得到m的 所有素因子 以及 所有素因子的个数,题目求的 是n个因子的 不同序列的个数,所以每次 只能选出n个因子,这n个因子由素因子

Codeforces Round #400 C 前缀和,思维

ICM Technex 2017 and Codeforces Round #400 (Div. 1 + Div. 2, combined) C. Molly's Chemicals 题意:n个数,问有多少个区间的和是k的次方数,即sum([l, r])=k^x, x>=0. abs(k)<=10. tags:一开始O(n^2)统计,果然炸了.. 这题要在统计到第 i 个数时,看s[i]-k^x是否在前面出现过.因为k指数增长很快,这样就是O(n). // #400 #include<b

Codeforces Round#413 Problem A - C

[写在前面感(乱)叹(七)人(八)生(糟)的话] 本想借此机会一口气玩到蓝名,结果,A题写炸(少判了一种情况),C题写炸(辜负了我5分钟狂敲出来的线段树),结果又掉Rating...内心好绝望... Problem#A Carrot Cakes vjudge链接[here] (偷个懒,cf链接就不给了) 题目大意是说,烤面包,给出一段时间内可以考的面包数,建第二个炉子的时间,需要达到的面包数,问建炉子是否合理. 玄学 & 智商题,可能是因为我智商不够,所以在我决定休息的时候被hank掉了...

CodeForces 731C Socks

http://codeforces.com/problemset/problem/731/C 并查集+贪心 将要求颜色相同的袜子序号放入一个集合中 贪心:然后统计这个集合中出现次数最多但颜色 可以得到这个集合要repain的次数 代码有难度 统计集合数 int tot;//总的集合数 for (int i = 1; i <= n; i++) if(par[i] == i) { rec[tot++] = i;//记录根节点 } //统计每个集合红颜色的个数 map<int, int> cl

CodeForces 76A Gift - 最小生成树

The kingdom of Olympia consists of N cities and M bidirectional roads. Each road connects exactly two cities and two cities can be connected with more than one road. Also it possible that some roads connect city with itself making a loop. All roads a

Codeforces Round #394 (Div. 2)

传送门:http://codeforces.com/contests/763,764 A题:[l,r]中有a个偶数,b个奇数,问存不存在l和r,1<=l<=r.很容易想到,如果abs(a-b)<=1,那么l和r就是存在的,除了一种情况,就是a=b=0的时候.由于l和r都大于等于1,所以当a=b=0时,不存在这种情况 #include <iostream> #include <cstdio> #include <cstring> #include <