B.Beauty Values
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,a,v[100000],ans;
int main(){
scanf("%lld", &n);
for (ll i = 1; i <= n; i++){
scanf("%lld", &a);
ans += (n-i+1) * (i-v[a]);
v[a] = i;
cout << ans << endl;
}
printf("%lld\n",ans);
return 0;
}
C. CDMA
题意:
求一个矩阵,只包含1和-1 ,使任意两行的对应列乘起来 求和为0;
1 -1
1 1
a[1][1] * a[2][1] + a[1][2] * a[2][2] = 0
题解:
找规律,发现将第一个矩阵向右平移,向下平移,取反后向右下平移,得到下一个矩阵
1 1 1 1
1 -1 1 -1
1 1 -1 -1
1 -1 -1 1
AC代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[1026][1026];
int main(){
int k = 2;
a[1][1] = 1; a[1][2] = 1; a[2][1] = 1; a[2][2] = -1;
while(k < 1024){
for(int i = 1; i <= k; i++){ // 向右平移
for(int j = k+1; j <= 2 * k; j++){
a[i][j] = a[i][j-k];
}
}
for(int i = k+1; i <= 2 * k; i++){ // 向下平移
for(int j = 1; j <= k; j++){
a[i][j] = a[i-k][j];
}
}
for(int i = k+1; i <= 2*k; i++){ // 取反后向右下平移
for(int j = k+1; j <= 2*k; j++){
a[i][j] = -a[i-k][j-k];
}
}
k = k * 2;
}
int u;
cin >> u;
for(int i = 1; i <= u; i++){
for(int j = 1; j <= u; j++){
cout << a[i][j] << " " ;
}
cout << endl;
}
return 0;
}
G. Gemstones
题意:
消消乐,三个连续的消掉,(4个也只消3个)
‘‘ATCCCTTG" → ‘‘ATTTG" → ‘‘AG”
题解:
用一个字符数组模拟栈就好
#include <bits/stdc++.h>
using namespace std;
int main(){
char a[1000005];
string s;
cin >> s;
int len = s.size(), ans = 0, top = 0;
for(int i = 0; i < len; i++){
a[top] = s[i];
top++;
if(top >= 3){
if(a[top-2] == a[top-1] && a[top-1] == a[top-3]){
ans++;
top = top - 3;
}
}
}
cout << ans << endl;
return 0;
}