A.
A
找1和3的个数就可;
#include <iostream>
#include <algorithm>
using namespace std;
int a[100];
int main() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
int cnt1 = 0;
for (int i = 1; i <= n; i++) {
cin >> a[i];
if (a[i] != 2) cnt1++;
}
cout << cnt1 << endl;
}
return 0;
}
B
c的位数可以使用10的倍数来表示,剩下两个数只要是互质,然后再给后面加c-1个0即可,使用特列末尾是0和1的例子就可以;
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
int main(){
int t;
cin>>t;
while(t--){
int a,b,c;
cin>>a>>b>>c;
ll x,y;
if(c==min(a,b)){
x=y=1;
a--,b--;
while(a--) x*=10;
while(b--) y*=10;
}else{
x=y=1;
a-=c,b-=c;
while(a--) x*=10;
while(b--) y*=10;
y++;
c--;
while(c--) x*=10,y*=10;
}
cout<<x<<' '<<y<<endl;
}
return 0;
}
C
找到每个数字的第一位,然后模拟;
m*50刚好不会t
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
const int N=300010;
int a[N];
bool st[N];
int b[N];
map<int,int> mp;
void fun(int x){
int k=mp[x];
mp[x]=1;
for(int i=1;i<=50;i++){
if(i==x) continue;
if(!mp[i]) continue;
else{
if(mp[i]<k) mp[i]++;
}
}
}
int main(){
int n,q;
cin>>n>>q;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){
if(!mp[a[i]]) {
mp[a[i]]=i;
}
}
while(q--){
int x;
cin>>x;
cout<<mp[x]<<endl;
fun(x);
}
return 0;
}
D
必须是满足要求的i和j尽可能少,假如i和j相差1,则要尽可能少出现连续三个相同的字符,可以让前两个字符相同,剩下一个不同;假如相差不是1,则枚举出所有的情况,然后按照长度再进行自增;
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
int n,k;
cin>>n>>k;
string s;
for(int i=0;i<k;i++){
s+='a'+i;
for(int j=i+1;j<k;j++){
s+='a'+i;
s+='a'+j;
}
}
string str=s;
while(str.size()<n) str+=s;
str.resize(n);
cout<<str<<endl;
return 0;
}