题目链接:https://codeforces.com/contest/1907
A. Rook
难度:800
根据输入,循环输出行和列并跳过棋子所在位置即可。
int t,a;
char c;
int main()
{
// ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
CI t;
while (t--)
{
scanf("\n%c%d",&c,&a);
F(i,1,8)
if (i!=a) CO c<<i L;
F(i,97,104)
if (i!=c) CO (char)i<<a L;
}
return 0;
}
B. YetnotherrokenKeoard
难度:1000
遇到字符b时,删除其前面离他最近的一个小写字母,如果没有就不删除。遇到字母B时,删除其前面离他最近的一个大写字母,如果没有就不删除。
为了快速完成添加字符和删除字符的操作,可以维护两个栈,分别表示大写字母和小写字母,栈中存储着字符的位置。需要删除大小字母时,就弹出对应的栈顶元素,最后将两个栈存储到同一个数组然后从小到大排序,就可以得到最后的字符串。
int t,ans[1000006];
string s;
stack<int> A,a;
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
CI t;
while (t--)
{
CI s;
F(i,0,s.size()-1)
{
if (s[i]=='b')
{
if (!a.empty()) a.pop();
}
elif (s[i]=='B')
{
if (!A.empty()) A.pop();
}
else
{
if (s[i]>='A'&&s[i]<='Z') A.push(i);
else a.push(i);
}
}
clear(ans);
int t=0;
while (!a.empty())
{
ans[t++]=a.top();
a.pop();
}
while (!A.empty())
{
ans[t++]=A.top();
A.pop();
}
sort(ans,ans+t);
F(i,0,t-1)
CO s[ans[i]];
CL
}
return 0;
}
C. Removal of Unattractive Pairs
难度:1200
用桶来统计每个字母出现的次数,如果没有字母超过总数的一半,则总会被消除掉,如果超过了一半,则肯定有一部分该字母无法被消除掉
int t,n,a[26];
string s;
int main()
{
// ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
CI t;
while (t--)
{
clear(a);
CI n;
CI s;
F(i,0,n-1)
a[s[i]-97]++;
int m=0;
F(i,0,25)
m=max(m,a[i]);
CO max(n%2,2*m-n) L;
}
return 0;
}
D. Jumping Through Segments
难度:1400
本题需要用二分查找,来找到一个最小的k。对于二分查找中的检查函数,可以求出人在当前k值下的移动范围与目标范围的交集,下一次以该交集为基础,求出人的最大移动范围与目标范围的交集并不断进行该步骤,如果其中任意一次求交集时发现并不存在交集,即人无法移动到目标位置,则当前k值无法得到答案。
LL t,n,a[200005],b[200005];
int check(LL k)
{
LL l=0,r=0;
F(i,1,n)
{
l=max(l-k,a[i]);
r=min(r+k,b[i]);
if (l>r) return 0;
}
return 1;
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
CI t;
while (t--)
{
CI n;
F(i,1,n)
CI a[i]>>b[i];
LL l=0,r=1e9;
while (l<=r)
{
LL mid=(l+r)/2;
if (check(mid)) r=mid-1;
else l=mid+1;
}
CO l L;
}
return 0;
}
Comments | NOTHING