小红学会了很多英文单词,妈妈为了帮小红加强记忆,拿出纸、笔,把 N 个单词写在纸上的一行里,小红看了几秒钟后,将这张纸扣在桌子上。妈妈问小红:“你能否将这 N 个单词按照字典排列的顺序,从小到大写出来?”小红按照妈妈的要求写出了答案。现在请你编写程序帮助妈妈检查小红的答案是否正确。注意:所有单词都由小写字母组成,单词两两之间用一个空格分隔。
//说实话,没看懂这个代码,可能是我太菜了吧 #include<bits/stdc++.h> usingnamespacestd; constint N = 100005; int a[N]; int n, k; longlongmax_position(int x) { longlong result = 0; int l = 0, r = -1, num = 0; while (r < n) { if (num < k) { if (a[r + 1] <= x)num++; r++; } else { result += n - r; if (a[l] <= x)num--; l++; } } return result; } intmain() { cin >> n >> k; int*b=newint[n]; for (int i = 0; i < n; i++) { cin >> a[i]; b[i] = a[i]; } sort(b, b + n); int len = unique(b, b + n) - b; int l = 0, r = len - 1; int ans = 0; while (l <= r) { int mid = (l + r) / 2; longlong ret = max_position(b[mid]); if (ret >= k) { ans = b[mid]; r = mid - 1; } else l = mid + 1; } cout << ans; return0; }
#include<iostream> #include<math.h> usingnamespacestd; typedeflonglong ll; constint maxn = 50010; double Si[maxn], wi[maxn]; int n, Ca; //计算聚会位置在pos时的消极情绪之和 doubleans(double pos) { double sum = 0; for (int i = 0; i < n; i++) { //计算每个奶牛距离聚会位置的距离(非负) double dist = Si[i] - pos; if (dist < 0) dist = -dist; sum += pow(dist, 3) * wi[i]; } return sum; } intmain() { cin >> Ca; for (int i = 1; i <= Ca; i++) { cin >> n; for (int j = 0; j < n; j++) { cin >> Si[j] >> wi[j]; } //找到坐标位置最小的奶牛 double low = Si[0]; for (int k = 0; k < n; k++) if (Si[k] < low) low = Si[k]; //找到坐标位置最小的奶牛 double high = Si[0]; for (int l = 0; l < n; l++) if (Si[l] > high) high = Si[l]; //三分查找法确定最终位置 while (high - low > 1e-7) { double m1 = (high + low) / 2.0; double m2 = (m1 + high) / 2.0; if (ans(m1) > ans(m2)) low = m1; else high = m2; } cout << "Case #" << i << ": " << ll(ans(low) + 0.5) << endl; } return0; }
问题 E: 光合作用
题目描述
蒜头是个爱学习的孩子,他总喜欢在生活中做一些小实验,这次蒜头想研究一下光合作用。蒜头的实验材料有如下几样:神奇的种子,普通的纸箱和一些光源。一开始,蒜头将种子均匀的种在了箱子底部,你可以将其看成 X 轴,种子的位置为 X 轴上的点。然后蒜头用纸板将箱子盖住,并在纸板上安装了一些光源(具体见图,顶上的为光源,光源两边与顶部的夹角都为45度,黄色部分为光照,绿色的为植物。)。神奇的种子会在有光的情况下一直向上生长直到没光为止。现在蒜头想知道当实验结束时每颗种子的高度是多少?
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> usingnamespacestd; /********************************************************************************************* lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。 upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。 ********************************************************************************************/ constint maxn = 1e5 + 5; int x[maxn]; intmain() { int T; cin >> T; while (T--) { int n, m, h; cin >> n >> m >> h; for (int i = 1; i <= m; i++) { cin >> x[i]; } sort(x + 1, x + m + 1); for (int i = 1; i <= n; i++) { int ans = 0; int cnt = lower_bound(x + 1, x + m + 1, i) - x; if (cnt == 1 && m != 0) { ans = max(ans, h - x[cnt] + i); } elseif (cnt == m + 1 && m != 0) { ans = max(ans, h - i + x[cnt - 1]); } elseif (m != 0) { ans = max(0, max(h - i + x[cnt - 1], h - x[cnt] + i)); } cout << ans << endl; } } return0; }