A - Vitaly and Strings 给出两个串S,T 保证T字典序一定大于等于S问有没有存在某个串使得字典序严格大于S且小于T,无输出 no such string。贪心策略正确即可
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
#define pi acos(-1.0)
#define eps 1e-8
#define asd puts("sdasdasdasdasd");
typedef long long ll;
const int inf = 0x3f3f3f3f;
char a[102], c[103];
char z[103];
int main()
{
while( cin >> a >> c )
{
int OK = 0;
int len = strlen( a );
for( int i = 0; i < len; ++i )
{
//if( c[i] - a[i] >= 0 )
{
if( c[i] - a[i] >= 2 )
{
strcpy( z, a );
z[i] = a[i] + 1;
OK = 2;
break;
}
if( OK == 1 )
{
if( c[i] != 'a' )
{
OK = 2;
strcpy( z, c );
z[i] = c[i] - 1;
break;
}
if( a[i] != 'z' )
{
OK = 2;
strcpy( z, a );
z[i] = a[i] + 1;
break;
}
}
if( !OK && c[i] - a[i] == 1 )
{
OK = 1;
continue;
}
}
}
if( OK == 2 )
cout << z << endl;
else
cout << "No such string" << endl;
}
return 0;
}
B - Tanya and Postcard 算是题意题吧。给出S,T串,在T串中找S中的字符,使大小写字母相同的尽可能多,如果找不到大小写相同的,就尽量找同是abc的这种(a -> A, A->a)
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
#define pi acos(-1.0)
#define eps 1e-8
#define asd puts("sdasdasdasdasd");
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int N = 200010;
char a[N], c[N];
int vi[500], v[500];
int main()
{
while( cin >> a >> c )
{
int ans = 0, cnt = 0;
memset( vi, 0, sizeof( vi ) );
memset( v, 0, sizeof ( v ) );
int lena = strlen( a );
int lenc = strlen( c );
for( int i = 0; i < lena; i++ )
vi[ a[i] ]++;
for( int i = 0; i < lenc; i++ )
v[ c[i] ]++;
for( int i = 0; i < 300; i++ )
{
int t = min( v[i], vi[i] );
ans += t;
v[i] -= t;
vi[i] -= t;
}
for ( int i = 'a'; i <= 'z'; i++ )
{
cnt += ( min( v[i], vi[i -'a' + 'A' ]) + min(vi[i], v[i - 'a' + 'A']) );
}
cout << ans << " " << cnt << endl;
}
return 0;
}
C - Anya and Smartphone给出n个数及区间k的大小,n个数分布成(k,k+1...2n)(2k+1,2k+2...3k),接下来找m个数,从第一个区间开始向后翻,找到之后找到的那个数的位置往前挪一格,求最后的操作数
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
#define pi acos(-1.0)
#define eps 1e-8
#define asd puts("sdasdasdasdasd");
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int N = 100050;
int pos[N], a[N];
int n, m, k;
int main()
{
while(~scanf("%d%d%d", &n, &m, &k))
{
for( int i = 1; i <= n; i++ )
{
scanf("%d", &a[i]);
pos[ a[i] ] = i;
}
ll ans = 0;
while( m-- )
{
int x;
scanf("%d", &x);
ans += ( pos[x] % k > 0 ? 1: 0 ) + pos[x] / k;
int t = pos[x];
if( t != 1 )
{
int xx = a[ t-1 ];
pos[x] = t-1;
pos[xx] = t;
swap( a[t], a[t-1] );
}
}
cout << ans << endl;
}
return 0;
}