CodeForces - 767A
题意:从第一个数开始看,如果这个数是最大的,那么就输出这个数然后再往前找,如果前面的是比他小一的继续输入,如果不符合条件就输出空行,
题解:水过
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #define INF 0x3f3f3f3f #define lowbit(x) (x&(-x)) using namespace std; typedef long long ll; const int maxn = 1e5 + 10; int a[maxn]; int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { int x; scanf("%d",&x); a[x] = i; } int pos = n; for(int i = 1; i <= n;i++) { if(pos == 0) break; while(true) { if(pos == 0) break; if(a[pos] <= i) { printf("%d ",pos); pos--; } else break; } printf("\n"); } }
CodeForces - 767B
题意:一个人想去办理事情,想等待最少的时间去办理,现在他知道当天办公室的开门时间和工作人员对于每个人的接待时间(都是t)和他们的工作时间,然后他还知道当天去办理业务的每个人的到达时间,如果他和其他人在同时到达那里的话,他需要排在最后去办理,还有就是工作人员在剩余工作时间不足以完成一个人的业务办理的时候,他不会给新来的人办理业务。(他可以在零点到,办公室在零点后ts时开门,tf时关门,可以提前到,按到的先后排队)
题解:贪心 + 模拟
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #define INF 0x3f3f3f3f #define lowbit(x) (x&(-x)) using namespace std; typedef long long ll; const int maxn = 1e5 + 10; ll m = 1e12 + 10; ll k,n,ts,tf,t,ans; int main() { scanf("%lld %lld %lld", &ts, &tf, &t); scanf("%lld", &n); while (n--) { scanf("%lld",&k); if(k <= tf - t) { if(k && max(ts,k - 1) <= tf - t && ts - k + 1 < m) { m = ts - k + 1; ans = min(ts,k - 1); } ts = max(ts,k) + t; } } if(ts <= tf - t) ans = ts; printf("%lld\n",ans); }
CodeForces - 767C
题意:有一棵树,每个节点都有一个权值,需要分成相等的三部分,能则输出剪下的结点否则输出-1(不能剪下根节点)
题解:先判断所有的值总和是不是 3 的倍数,如果不是的话直接输出 -1,如果是的话,就从根节点开始跑dfs累加权值,当权值跑到为总值的1/3时就记录下顶点值。最后判断记录下来的顶点的个数是不是2个,如果是两个的话就刚好把一颗树割成了三部分
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #define INF 0x3f3f3f3f #define lowbit(x) (x&(-x)) using namespace std; typedef long long ll; const int maxn = 1e6 + 10; int n; vector<int>g[maxn]; int tmp,num,root; int val[maxn]; ll sum[maxn]; int ans[3]; void dfs(int now) { sum[now] = val[now]; for(int i = 0; i < g[now].size(); i++) { int v = g[now][i]; dfs(v); sum[now] += sum[v]; } if(root != now && sum[now] == tmp && num < 2) { ans[num++] = now; sum[now] = 0; } } int main() { scanf("%d",&n); tmp = num = 0; for(int i = 1; i <= n; i++) { int u; scanf("%d %d",&u,&val[i]); tmp += val[i]; if(u == 0) { root = i; continue; } g[u].push_back(i); } if(tmp % 3 != 0) { printf("-1\n"); } else { tmp /= 3; dfs(root); if(num == 2) printf("%d %d\n",ans[0],ans[1]); else printf("-1\n"); } }
CodeForces - 767D
题意:一个人一天要喝k瓶牛奶,如果冰箱里的牛奶不够k瓶就全部喝完,目前冰箱里有n瓶牛奶,给出每瓶牛奶的保质期,即还有几天会过期,过期的牛奶要被扔掉,再给出商店中m瓶牛奶的保质期,问是否存在一种方案使得这个人不扔掉任何一瓶牛奶,如果有,他最多可以从商店买多少瓶牛奶
原文:https://www.cnblogs.com/smallhester/p/11160965.html