本来以为会巨难无比又有别的比赛可以打于是赛后补题,结果发现似乎略水,反正是找到了四个水题先贴下来
ZOJ-4099 J
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; int t; ll x, y, n; int main() { cin >> t; while (t--) { scanf("%lld",&n); x = n * 8; y = n * 9; printf("%lld %lld\n",x,y); } return 0; }
找相差给出数的两个合数。所以找两个最小的相差为一的合数就好了。
ZOJ-4090 A
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; pair<int, int>g[100005], b[100005]; int n, m, t; int main() { cin >> t; while (t--) { scanf("%d%d",&n,&m); int b0 = 0, g0 = 0; for (int i = 0; i < n; i++)scanf("%d", &b[i].second); for (int i = 0; i < m; i++)scanf("%d", &g[i].second); for (int i = 0; i < n; i++) { scanf("%d", &b[i].first); if (!b[i].first)b0++; } for (int i = 0; i < m; i++) { scanf("%d", &g[i].first); if (!g[i].first)g0++; } sort(b, b + n); sort(g, g + m); int ans = 0; int now = g0; for (int i = 0; i < b0&&now<m; i++) if (b[i].second > g[now].second) {ans++; now++;} now = b0; for(int i=0;i<g0&&now<n;i++) if (b[now].second < g[i].second) {ans++;now++;} cout << ans << endl; } return 0; }
匹配高矮舞伴。按身高排序,给不同需求排一遍,完了。
ZOJ-4094 E
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int n, t; int a[105], b[105]; int main() { cin >> t; while (t--) { scanf("%d", &n); for (int i = n - 1; i >= 0; i--)scanf("%d", &a[i]); for (int i = n - 1; i >= 0; i--)scanf("%d", &b[i]); long long tp = 0; bool falg = 1; for (int i = 0; i < n; i++) { if (b[i] + tp < a[i]) { falg = 0; break; } tp += b[i] - a[i]; } if (!falg)cout << "No" << endl; else cout << "Yes" << endl; } return 0; }
异常水,异常wa了很多次,变量名用重复了orz
ZOJ-4096 G
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int n, t,k; int a[100005],b[100005]; int main() { cin >> t; while (t--) { scanf("%d%d", &n,&k); int ma = -1; int l = 0, r = 0,tp; for (int i = 0; i < n; i++) { scanf("%d", &tp); if (tp < 0)b[l++] = -tp; else a[r++] = tp; ma = max(ma, abs(tp)); } sort(a, a + r); sort(b, b + l); long long ans = 0; for (int i = r - 1; i >= 0; i -= k)ans += a[i] * 2; for (int i = l - 1; i >= 0; i -= k)ans += b[i] * 2; ans -= ma; cout << ans << endl; } return 0; }
有一点需要思考了呢。
首先送信回来取信路程是乘2的,但是终结工作可以在送信地点,那么最远的地方就最后一次送。
其次,近的地方可以去远的地方的时候顺路去,不然就要重复走好几次。
最后,因为是往轴的两边送信,要分两边算。
所以,跳k个加个双倍,最后把最大值减掉一个就完成了。(๑•̀ㅂ•́)و✧
那就先这样吧。