Atto Round 1 (Codeforces Round 1041, Div. 1 + Div. 2)
来源:Dashboard - Atto Round 1 (Codeforces Round 1041, Div. 1 + Div. 2) - Codeforces
A. Mix Mex Max
思路
- 如果mex是0,那么max=min,所有数必须相等
- 如果mex不是0,那么min=0,mex=max,显然这不可能
- 如果全是0,max-min=0,mex!=0
- 规律:必须能组成全部数都相同且不能为0
代码
void solve()
{cin >> n;for(int i=1; i<=n; i++) cin >> a[i];int ans=-1;for(int i=1; i<=n; i++){if(a[i]==0){cout << "NO" << endl;return ;}if(a[i]>0){if(ans!=-1&&ans!=a[i]){cout << "NO" << endl;return ;}ans=a[i];}}cout << "YES" << endl;
}
B. Hamiiid, Haaamid... Hamid?
思路
分别找到此时向两边逃脱的最优解,找到最优解中的最坏解
代码
void solve()
{cin >> n >> x;cin >> s;x--;int f=0;for(auto i:s) if(i=='#') f=1;if(!f) // 全是空地,1天即可逃脱{cout << 1 << endl;return ;}int l = -1; // 左边最近墙壁位置(-1表示无)for(int i = x; i >= 0; i--){if(s[i] == '#'){l = i;break;}}int r = n; // 右边最近墙壁位置(n表示无)for(int i = x; i < n; i++){if(s[i] == '#'){r = i;break;}}int min1 = min(x, n - r); // 向左逃的限制int min2 = min(l + 1, n - x - 1); // 向右逃的限制int ans = max(min1,min2) + 1; // +1为当天cout << ans << endl;
}
这题虽说我开始写的有点麻烦,但是真力竭了。最后用对拍跑了一下19个数据就最后一个没过···
这种思维太成体系了,我一般都是开始有个思路后面边写边想,怎么可能开始就看那么远,等写的时候又该忘了。