虚拟参赛的,其实五道题都该赛时过的,可是
E
E
E 题,太毒瘤了,坐标弄错了。
题目链接
A题
- 思路
简单的模拟题,HASH一下 - 代码
void solve()
{
map<char,int> mp;
string s;cin>>s;
for (int i = 0; i < s.size();i ++) {
mp[s[i]] = i + 1;
}
cin>>s;
int ans = 0;
for (int i = 1;i < s.size();i ++) {
ans += abs(mp[s[i]] - mp[s[i-1]]);
}
cout<<ans<<endl;
}
B题
- 思路
每四个就会回到原来位置,所以见下。
无论 x 0 x_0 x0 是奇数还是偶数。 - 代码
void solve()
{
ll x0,n;cin>>x0>>n;
ll md = n % 4;
if (x0 % 2) {
for (ll i = n - md + 1;i <= n;i ++){
x0 += -a[i - (n-md)] * i;
}
}
else {
for (ll i = n - md + 1;i <= n;i ++){
x0 += a[i - (n-md)] * i;
}
}
cout<< x0 <<endl;
}
C题
- 思路
模拟 - 代码
void solve()
{
int n; cin>>n;
for (int i = 1;i <= n;i ++) cin>>a[i];
sort(a+1,a+1+n);
ll ans = a[1];
ll sum = 0;
for (int i = 1;i < n;i ++) {
// ans -= a[i];
sum += a[i];
a[i+1] -= sum;
ans = max(ans,a[i+1]);
}
cout<<ans<<endl;
}
D题
- 思路
尽量让 r e d red red 在前面,然后排序,看是否可以。
因为 r e d red red 可以无限加,无论原来的数字多小; b l u e blue blue 可以无限减,无论原来的数字多大。 - 代码
void solve()
{
int n; cin>>n;
for (int i = 1;i <= n;i ++) cin>>a[i].first;
for (int i = 1;i <= n;i ++) cin>>a[i].second;
sort(a+1,a+1+n,cmp);
// for (int i = 1;i <= n;i ++){
// cout<<a[i].second<<" "<<a[i].first<<endl;
// }
for (int i = 1;i <= n;i ++) {
if ((a[i].first < i && a[i].second == 'B')||(a[i].first > i &&a[i].second == 'R')) {
cout<<"NO"<<endl;return;
}
}
cout<<"YES"<<endl;
}
E题
- 思路
其实没啥技术含量,就是模拟,然后细节比较多吧算是这题。不过毒瘤的是对于我来说,没有看到 c c c 坐标是从高到低的,导致我一直怀疑样例是错的。 - 代码
void solve()
{
int n,m;cin>>n>>m;
string s;cin>>s;
int cf = 0,cz = 0,rf = 0,rz = 0;
int c = 0,r = 0;//row - L,R;col-U,D
for (int i = 0;i < s.size();i ++) {
if (s[i] == 'L') {
r --;
} else if (s[i] == 'R') {
r ++;
} else if (s[i] == 'U') {
c --;
} else {
c ++;
}
int trz = rz,trf = rf,tcf = cf,tcz = cz;
rz = max(rz,r);
rf = min(rf,r);
cz = max(cz,c);
cf = min(cf,c);
if ((abs(rz) + abs(rf) >= m) || (abs(cz) + abs(cf)) >= n){
cout<<(abs(tcf)+1)<<" "<<(abs(trf)+1)<<endl;
return;
}
}
// cout<<rz<<" "<<rf<<" "<<cz<<" "<<cf<<endl;
cout<<(abs(cf)+1)<<" "<<(abs(rf)+1)<<endl;
}
注:后面的题就先不补了,直接到 2300 分 2300分 2300分。