前言
很难受,自己缺少太多基础只是了,很多看起来可做的都写不了,自己实在是太菜了。
希望沈阳可以混一个 cu 吧。
另外这个题就太体现 ACM 思维的活跃性以及严谨性了,我还太菜,希望明年能拿个 Au 吧
F. Fields Division
题目大意,一个图,每个点点权 2i 询问将图分成两个连通块后,两边权值和相差最小的方案。
显然 2n 这个点太大了,我们考虑把它单独分开,剩下 n−1 个点找跑一个并查集, n−1 号点所在的连通块和其他即为所求。
I. Invested Money
题目大意,你借了钱后,每三十天还一次钱,如果那天是周末,就咕到周一
现在告诉你你多久借了钱,询问最近多少天后要还钱。
首先打表,发现 91 是一个循环节,那么我们直接就暴力好了(噩梦的开始)
但是你会发现大 WA 特 WA
因为前面那些数字不在循环里面,你仅仅是把后面的放进循环节了,所以我们保留前91和一个循环节才可以。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| #include <bits/stdc++.h> using namespace std; int n, a[100010], d, ans; int vis[210], aans[210]; string st; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin>>st; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; if(a[i]>91) a[i]=a[i]%91+91; vis[a[i]] = 1; } ans = 0x3f3f3f3f; if(st=="Mon") d=1; if(st=="Tue") d=2; if(st=="Wed") d=3; if(st=="Thu") d=4; if(st=="Fri") d=5; if(st=="Sat") d=6; if(st=="Sun") d=7; for(int i = 181; i >= 0; -- i) { int t = -i; int j = d; for(int k = 1; k <= i; ++ k) { j --; if(j == 0) j=7; } while((t < 0 && i != 0) || (t <= 0 && i == 0)) { t += 30; j += 2; if(j >= 8) j -= 7; if(j == 6) j = 1, t += 2; if(j == 7) j = 1, t ++; } aans[i]=t; } for(int i=0;i<=181;i++) if(vis[i]) ans=min(ans,aans[i]); cout<<ans<<"\n"; return 0; }
|
H. Hamilton - The Musicalv
这道题图建错了,我先说错误的方式,好让大伙嘲笑。
我们保证让偶数比奇数多 1 ,换句话说我们让偶数把奇数包围(加上一个0和 n+1 或者就是 n ),然后让原点连过来一条流量为 2 的边,然后向 0,n 或者 n+1 连一个流量为 1 的边,让后让每个奇数和偶数连一个流量为 1 费用为 Gi,j 的边,最后让奇数点和汇点相连。
很正确是不是,但是我们考虑有这种情况,2,4 两个点都连到了 3,5 ,这在题目条件下是不允许的,但是我们能跑出来。
所以为了避免这种情况,我们把 2,4 合点,这样再连 j 就代表子序列是 2,j,4 ,这样两个数对应了只能对应一个数字,而且必然的不会出现上面那样的情况。
只能说自己很菜,这都不知道,希望神仙 October 带飞