E gk的字符串
题意:给你一个带有’?'的字符串,要求使用小写字母替代,相邻的字母不可以相同,要求字典序最小,输出这个字符串。
分析:字典序最小使用’a’替换’?‘,如果前后有’a’就使用’b’替换,如果前后有’a’也有’b’,就用’c’替换,这三种情况。
题解:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int t;
cin >> t;
while(t--)
{
string s;
cin >> s;
s.insert(s.begin(), 'x');
s.insert(s.end(),'x');
for(int i=1;i<s.length()-1;i++)
{
if(s[i]=='?')
{
if(s[i-1]=='a'&&s[i+1]!='b')
s[i]='b';
if(s[i-1]!='b'&&s[i+1]=='a')
s[i]='b';
if(s[i-1]!='a'&&s[i+1]!='a')
s[i]='a';
if(s[i-1]=='b'&&s[i+1]=='a')
s[i]='c';
if(s[i-1]=='a'&&s[i+1]=='b')
s[i]='c';
}
}
for(int i=1;i<s.length()-1;i++)
cout << s[i];
cout << endl;
}
return 0;
}
G gk的数字游戏
题意:给两个整数n, m,求执行多少次操作有一个数字变成0,操作为
(1) n = n - m, n >= m
(2) m = m - n, n < m
分析:通过除法和取模运算,直接求出操作次数。
题解:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int t;
cin >> t;
while(t--)
{
ll n, m;
cin >> n >> m;
int ans = 0;
while(n!=0&&m!=0)
{
if(n<m) swap(n, m);
ans += n / m;
n = n % m;
}
cout << ans << endl;;
}
return 0;
}
I 又AK了
题意:给你通过每个题目的时间,求重新选择顺序,这场比赛的最小罚时。罚时的计算方式:每道题提交AC时刻时间的总和。
分析:先做解决快的,这样累计罚时才会最小,(1)差分,(2)排序,(3)前缀和。
题解:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[30];
int main()
{
int t;
cin >> t;
while(t--)
{
int n;
cin >> n;
for(int i=0;i<n;i++)
cin >> a[i];
sort(a, a + n);
for(int i=n-2;i>=0;i--)
{
a[i+1] = a[i+1] - a[i];
}
sort(a, a + n);
for(int i=1;i<n;i++)
{
a[i] = a[i] + a[i-1];
}
ll ans = 0;
for(int i=0;i<n;i++)
ans += a[i];
cout << ans << endl;
}
return 0;
}
L NP-hard
题意:给你数字n,x,y,求在x进制和y进制下十进制数n的位数上1的个数。
分析:使用进制的计算,暴力每位判断。
题解:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int t;
cin >> t;
while(t--)
{
int n, x, y;
cin >> n >> x >> y;
int s1 = 0, s2 = 0;
int m = n;
while(m != 0)
{
if(m % x == 1)
s1++;
m /= x;
}
while(n != 0)
{
if(n % y == 1)
s2++;
n /= y;
}
if(s1>s2) cout << ">\n";
else if(s1==s2) cout << "=\n";
else cout << "<\n";
}
return 0;
}