#include<iostream> #include<algorithm> usingnamespacestd; constint N = 1e4+5; int n; int t[N],d[N];
intmain(){ cin >> n; char op; int a = 0,b = 0,x; while (n--){ cin >> op >> x; if (op == 'T') t[a++] = x; // 开vector存方便一点 else d[b++] = x; } d[b++] = 1000; // 保证走到1000米
sort(t,t + a); sort(d,d + b); int i = 0,j = 0; double T = 0,D = 0,V = 1; while (i < a || j < b){ // 二路归并,y总写法,不用单独写两个循环 double x = t[i] - T,y = V*(d[j] - D); if (j == b || i < a && x <= y){ // 注意更新顺序 D += x / V; // 时间事件更早发生,先更新距离,然后时间和速度更新 T = t[i++]; V ++; } else{ T += y; // 距离事件更早发生,先更新时间,然后距离和速度更新 D = d[j++]; V ++; } } printf("%.0lf\n",T); // 保留整数 return0; }
#include<iostream> #include<algorithm> usingnamespacestd; constint N = 1005; int n,m; char g[N][N]; int dx[] = {-1,0,1,0},dy[] = {0,1,0,-1}; // 注意按照顺时针方向,如图所示
intdfs(int x,int y,int d){ // 根据坐标和方向dfs if (x < 0 || x >= n || y < 0 || y >= m) return0; // 出界,找到一条链 if (g[x][y] == '/') d ^= 1; // 根据方向编号进行反射,改变方向 else d ^= 3; return dfs(x + dx[d],y + dy[d],d) + 1; }
intmain(){ cin >> n >> m; for (int i = 0;i < n;i ++) for (int j = 0;j < m;j ++) cin >> g[i][j]; int res = 0; for (int i = 0;i < m;i ++){ // 光线从上面和下面入射 res = max(res,dfs(0,i,2)); res = max(res,dfs(n-1,i,0)); } for (int i = 0;i < n;i ++){ // 光线从左面和右面入射 res = max(res,dfs(i,0,1)); res = max(res,dfs(i,m-1,3)); } cout << res; return0; }
这是一个炎热的夏日。 懒洋洋的奶牛贝茜想将自己放置在田野中的某个位置,以便可以在短距离内尽可能多地吃到美味的草。 贝茜所在的田野中共有 N 片草地,我们可以将田野视作一个一维数轴。 第 i 片草地中包含 gi 单位的青草,位置坐标为 xi。 不同草地的位置不同。 贝茜想选取田野中的某个点作为她的初始位置(可能是某片草地所在的点)。 只有一片草地与她的初始位置的距离不超过 K 时,贝茜才能吃到那片草地上的草。 如果贝茜选择最佳初始位置,请确定她可以吃到的青草最大数量。
输入格式 第一行包含两个整数 N 和 K。 接下来 N 行,每行描述一片草地,包含两个整数 gi 和 xi。
#include<iostream> #include<algorithm> usingnamespacestd; constint N = 1e6+5; int n,k; int b[N];
intmain(){ cin >> n >> k; int g,x; while (n--){ cin >> g >> x; int l = max(x-k,0); int r = min(x+k,(int)1e6); b[l] += g,b[r + 1] -= g; } int ans = 0,sum = 0; for (int i = 0;i <= 1e6;i ++){ sum += b[i]; ans = max(ans,sum); } cout << ans; return0; }
#include<iostream> #include<algorithm> #include<map> usingnamespacestd; typedefpair<int,int> PII; #define fi first #define se second constint N = 1e5+5; PII p[N]; // 存放牛的距离和品种 int s[N]; unordered_map<int,int> m; // 记录s[i]出现的下标i
intmain(){ int n; cin >> n; m[0] = 0; // 细节,s[0] = 0,s[0]在下标为0时出现一次 int x;char c; for (int i = 1;i <= n;i ++){ cin >> x >> c; p[i] = {x,(c == 'G' ? 1 : -1)}; } sort(p + 1,p + n + 1); int ans = 0,pos = p[1].fi,val = p[1].se; for (int i = 1;i <= n;i ++){ s[i] = s[i-1] + p[i].se; // 前缀和 if (p[i].se == val) ans = max(ans,p[i].fi - pos); // 求连续的同一种牛的nas else pos = p[i].fi,val = p[i].se; // 包含多种牛的同数量的ans if (m.count(s[i])) ans = max(ans,p[i].fi - p[m[s[i]] + 1].fi); else m[s[i]] = i; } cout << ans; return0; }