135 - ZOJ Monthly, August 2014

2024-06-01 19:48
文章标签 zoj monthly 2014 135 august

本文主要是介绍135 - ZOJ Monthly, August 2014,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

135 - ZOJ Monthly, August 2014

A:构造问题,判断序列奇偶性,很容易发现最小值不是1就是0,最大值不是n就是n - 1,注意细节去构造即可

E:dp,dp[i][j]表示长度i,末尾状态为j的最大值,然后每个位置数字取与不取,不断状态转移即可

G:就一个模拟题没什么好说的

H:dfs,每次dfs下去,把子树宽度保存下来,然后找最大值,如果有多个,就是最大值+cnt宽度

I:构造,如果r * 2 > R,肯定无法构造,剩下的就二分底边,按等腰三角形去构造即可

代码:

A:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;int n;void print(int n) {if (n == 3) {printf("3 1 2");return;}if (n % 2) {int len = (n - 3) / 2;printf("%d %d", n, n - len);for (int i = n - 1; i > n - len; i--)printf(" %d %d", i, i - len);printf(" 3 1 2");}else {int len = n / 2;printf("%d %d", n, n - len);for (int i = n - 1; i > n - len; i--)printf(" %d %d", i, i - len);}
}void print2(int n) {print(n - 2);printf(" %d %d", n - 1, n);
}void solve() {if (n == 1) {printf("1 1\n1\n1\n");return;}if (n == 2) {printf("1 1\n1 2\n2 1\n");return;}if (n == 3) {printf("0 2\n3 1 2\n1 2 3\n");return;}if (n % 2 == 0) {if (n / 2 % 2) {printf("1 %d\n", n - 1);print2(n); printf("\n");print2(n - 1);printf(" %d\n", n);}else {printf("0 %d\n", n);print(n); printf("\n");print(n - 1); printf(" %d\n", n);}}else {if ((n + 1) / 2 % 2) {printf("1 %d\n", n);print(n - 2); printf(" %d %d\n", n - 1, n);print(n - 1); printf(" %d\n", n);}else {printf("0 %d\n", n - 1);print(n); printf("\n");print2(n - 1); printf(" %d\n", n);}}
}int main() {while (~scanf("%d", &n)) {solve();}return 0;
}

E:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;const int INF = 0x3f3f3f3f;
int t, n;map<int, int> dp[2];
map<int, int>::iterator it;int lowbit(int x) {return (x&(-x));
}int solve() {dp[0].clear();int pre = 1, now = 0;int num;dp[0][0] = 0;for (int i = 0; i < n; i++) {scanf("%d", &num);num /= 2;swap(pre, now);dp[now].clear();for (it = dp[pre].begin(); it != dp[pre].end(); it++) {int s = it->first;if (dp[now].count(s) == 0) dp[now][s] = dp[pre][s];else dp[now][s] = max(dp[now][s], dp[pre][s]);int next;if (s % num) {next = num;if (dp[now].count(next) == 0) dp[now][next] = dp[pre][s] + num * 2;else dp[now][next] = max(dp[now][next], dp[pre][s] + num * 2);}else {next = s + num;int add = (s % lowbit(next) * 2 + num) * 2;if (dp[now].count(next) == 0) dp[now][next] = dp[pre][s] + add;else dp[now][next] = max(dp[now][next], dp[pre][s] + add);}}}int ans = 0;for (it = dp[now].begin(); it != dp[now].end(); it++)ans = max(ans, it->second);return ans;
}int main() {scanf("%d", &t);while (t--) {scanf("%d", &n);printf("%d\n", solve());}return 0;
}

G:

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;const int N = 55;
const int d[8][2] = {{1, 0}, {1, 1}, {1, -1}, {0, 1}, {0, -1}, {-1, 0}, {-1, 1}, {-1, -1}};typedef pair<int, int> pii;int t;
int n, m, f, k;
int g[N][N];
int gg[N][N];
char str[55];
vector<pii> go[1005];void solve() {for (int ti = 1; ti <= f; ti++) {memset(gg, 0, sizeof(gg));for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {if (g[i][j] == 1) {for (int k = 0; k < 8; k++) {int xx = i + d[k][0];int yy = j + d[k][1];if (xx <= 0 || xx > n || yy <= 0 || yy > m) continue;gg[xx][yy]++;}}}}for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++) {if (g[i][j] == 2) continue;else if (g[i][j] == 0) {if (gg[i][j] == 3) g[i][j] = 1;}else {if (gg[i][j] < 2 || gg[i][j] > 3) g[i][j] = 0;}}for (int i = 0; i < go[ti].size(); i++) {g[go[ti][i].first][go[ti][i].second] = 2;}}for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {if (g[i][j] == 2) printf("X");else printf("%d", g[i][j]);}printf("\n");}
}int main() {scanf("%d", &t);while (t--) {scanf("%d%d%d%d", &n, &m, &f, &k);for (int i = 1; i <= f; i++)go[i].clear();for (int i = 1; i <= n; i++) {scanf("%s", str + 1);for (int j = 1; j <= m; j++) {g[i][j] = str[j] - '0';}}int ti, x, y;while (k--) {scanf("%d%d%d", &ti, &x, &y);go[ti].push_back(make_pair(x, y));}solve();}return 0;
}

H:

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;const int N = 10005;int n;
vector<int> g[N];int dfs(int u) {int sz = g[u].size();vector<int> save;for (int i = 0; i < sz; i++)save.push_back(dfs(g[u][i]));sort(save.begin(), save.end());sz = save.size();int cnt = 0;int ans = 1;for (int i = sz - 1; i >= 0; i--) {if (i != sz - 1 && save[i] != save[i + 1]) break;ans = save[i] + cnt;cnt++;}return ans;
}int main() {while (~scanf("%d", &n)) {for (int i = 1; i <= n; i++)g[i].clear();int v;for (int i = 2; i <= n; i++) {scanf("%d", &v);g[v].push_back(i);}printf("%d\n", dfs(1));}return 0;
}

I:

#include <cstdio>
#include <cstring>
#include <cmath>double r, R;double h, x;double cal(double a) {double d = a / 2;h = sqrt(R * R - d * d) + R;x = sqrt(h * h + d * d);return a * x * x / (2 * R * (a + x + x));
}void solve() {double lx = 0, rx = sqrt(3.0) * R;double mid;for (int i = 0; i < 1000; i++) {mid = (lx + rx) / 2;double tmp = cal(mid);if (tmp > r) rx = mid;else lx = mid;}cal((lx + rx) / 2);printf("%.10lf %.10lf %.10lf\n", mid, x, x);
}int main() {while (~scanf("%lf%lf", &r, &R)) {if (r * 2 > R) printf("NO Solution!\n");else solve();}return 0;
}


这篇关于135 - ZOJ Monthly, August 2014的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1021956

相关文章

数论ZOJ 2562

题意:给定一个数N,求小于等于N的所有数当中,约数最多的一个数,如果存在多个这样的数,输出其中最大的一个。 分析:反素数定义:对于任何正整数x,其约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数。 性质一:一个反素数的质因子必然是从2开始连续的质数。 性质二:p=2^t1*3^t2*5^t3*7

zoj 1721 判断2条线段(完全)相交

给出起点,终点,与一些障碍线段。 求起点到终点的最短路。 枚举2点的距离,然后最短路。 2点可达条件:没有线段与这2点所构成的线段(完全)相交。 const double eps = 1e-8 ;double add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;

zoj 4624

题目分析:有两排灯,每排n个,每个灯亮的概率为p,每个灯之间互不影响,亮了的灯不再灭,问两排中,每排有大于等于m个灯亮的概率。 设dp[ i ][ j ]为第一排亮了i个灯,第二排亮了j个灯,距离目标状态的期望天数。显然 i >= m ,j >= m时 , dp[ i ][ j ] = 0 。 状态转移 : 第一排亮了a个灯,a 在[ 0 , n - i] 之间,第二排亮了b个灯 , b 在

zoj 3228 ac自动机

给出一个字符串和若干个单词,问这些单词在字符串里面出现了多少次。单词前面为0表示这个单词可重叠出现,1为不可重叠出现。 Sample Input ab 2 0 ab 1 ab abababac 2 0 aba 1 aba abcdefghijklmnopqrstuvwxyz 3 0 abc 1 def 1 jmn Sample Output Case 1 1 1 Case 2

ZOJ Monthly, August 2014小记

最近太忙太忙,只能抽时间写几道简单题。不过我倒是明白要想水平提高不看题解是最好的了。 A  我只能死找规律了,无法证明 int a[50002][2] ;vector< vector<int> > gmax , gmin ;int main(){int n , i , j , k , cmax , cmin ;while(cin>>n){/* g

2014 Multi-University Training Contest 8小记

1002 计算几何 最大的速度才可能拥有无限的面积。 最大的速度的点 求凸包, 凸包上的点( 注意不是端点 ) 才拥有无限的面积 注意 :  凸包上如果有重点则不满足。 另外最大的速度为0也不行的。 int cmp(double x){if(fabs(x) < 1e-8) return 0 ;if(x > 0) return 1 ;return -1 ;}struct poin

2014 Multi-University Training Contest 7小记

1003   数学 , 先暴力再解方程。 在b进制下是个2 , 3 位数的 大概是10000进制以上 。这部分解方程 2-10000 直接暴力 typedef long long LL ;LL n ;int ok(int b){LL m = n ;int c ;while(m){c = m % b ;if(c == 3 || c == 4 || c == 5 ||

2014 Multi-University Training Contest 6小记

1003  贪心 对于111...10....000 这样的序列,  a 为1的个数,b为0的个数,易得当 x= a / (a + b) 时 f最小。 讲串分成若干段  1..10..0   ,  1..10..0 ,  要满足x非递减 。  对于 xi > xi+1  这样的合并 即可。 const int maxn = 100008 ;struct Node{int

ZOJ 3324 Machine(线段树区间合并)

这道题网上很多代码是错误的,由于后台数据水,他们可以AC。 比如这组数据 10 3 p 0 9 r 0 5 r 6 9 输出应该是 0 1 1 所以有的人直接记录该区间是否被覆盖过的方法是错误的 正确方法应该是记录这段区间的最小高度(就是最接近初始位置的高度),和最小高度对应的最长左区间和右区间 开一个sum记录这段区间最小高度的块数,min_v 记录该区间最小高度 cover

2014年暑假培训 - 数论

A银河上的星星 /**************************************************************     Problem: 1014     User: DoubleQ     Language: C++     Result: Accepted     Time:190 ms     Memor