Problem A. Chord
题目大意
给出钢琴上的12个键,每12个为一个周期,然后输入三个字符串,分别代表一个键,A,B,C,如果A和B差4,且B和C差3,输出“Major triad”,如果A和B差3,且B和C差4,输出“Minor triad”,其他情况输出“Dissonance”。
解题思路
暴力找,根据特定的位置关系,得到答案。
代码
#include <iostream>
#include <iostream>
#include <algorithm>
#include <string>
#include <bits/stdc++.h>
using namespace std;
const int N = 50;
const int INF = 0x3f3f3f3f;
struct node
{
char s[5];
int num;
};
int main()
{
node pi[50] = {{"C", 1}, {"C#", 2}, {"D", 3}, {"D#", 4}, {"E", 5},{"F", 6},{"F#", 7}, {"G", 8},{"G#", 9},{"A", 10}, {"A#", 11}, {"B", 12}};
int t;
cin >> t;
char a[5], b[5], c[5];
while(t--)
{
int bb = 0, aa = 0, cc = 0;
cin >> a >> b >> c;
for(int i = 0; i < 12; i ++)
{
if(strcmp(a, pi[i].s) == 0)
aa = pi[i].num;
else if(strcmp(b, pi[i].s) == 0)
bb = pi[i].num;
else if(strcmp(c, pi[i].s) == 0)
cc = pi[i].num;
}
if(bb < aa) bb += 12;
if(cc < bb) cc += 12;
if(bb - aa == 4 && cc - bb == 3) cout << "Major triad\n";
else if(bb - aa == 3 && cc - bb == 4) cout << "Minor triad\n";
else cout << "Dissonance\n";
}
return 0;
}
B - Problem Select (水题)
比较最后面的数,要求输出几个,就从小到大输出几个即可。
代码
#include <bits/stdc++.h>
using namespace std;
char str[1010][1010];
int num[1010];
int main()
{
int t,n,k;
scanf("%d",&t);
while(t--)
{
int top = 0;
scanf("%d%d",&n,&k);
getchar();
for(int i=0;i<n;i++) scanf("%s",str[i]);
for(int i=0;i<n;i++)
{
int len = strlen(str[i]);
int sum = 0;
for(int j=0;j<len;j++)
{
if(str[i][j]>='0'&&str[i][j]<='9')
sum = sum*10+(str[i][j]-'0');
}
num[top++] = sum;
}
sort(num,num+top);
for(int i=0;i<k-1;i++) printf("%d ",num[i]);
printf("%d\n",num[k-1]);
}
return 0;
}
C - String Game
动态规划
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e9 + 7;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
string s1, s2;
while (cin >> s1 >> s2) {
ll i, j, h, a[1001], max = 0;
for (i = 0; i < s2.size(); i++)a[i] = 0;
for (i = 0; i < s1.size(); i++) {
for (j = s2.size() - 1; j >= 0; j--) {
if (s1[i] == s2[j]) {
if (j != 0) a[j] += a[j - 1];
else a[j]++;
a[j] %= N;
}
}
}
cout << a[s2.size() - 1] << endl;
}
return 0;
}
E - Shorten the Array
题目大意
有一个数组a,给出一个下标i,如果a[i]和a[i+1] 是正整数,你可以让a[i] mod a[i+1]或者让a[i+1] mod a[i] 代替a[i]和a[i+1]。最后输出最小剩余多少个数。
解题思路
找数组和每个余数中的除0以外的最小值,然后遍历数组,找数组中等于最小值的个数(cnt)。如果cnt 为 0,输出1,否则输出cnt / 2上取整。
代码
#include <iostream>
using namespace std;
const int N = 1e6 + 10;
const int INF = 0x3f3f3f3f;
int a[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie();
cout.tie();
int t;
cin >> t;
while(t --)
{
int n;
int cnt = 0;
cin >> n;
for(int i = 0; i < n; i ++)
{
cin >> a[i];
}
int sum = INF;
for(int i = 0; i < n - 1; i ++)
{
sum = min(sum, min(a[i], a[i + 1]));
if(a[i] % a[i + 1] > 0) sum = min(sum, a[i] % a[i + 1]);
if(a[i + 1] % a[i] > 0) sum = min(sum, a[i + 1] % a[i]);
}
for(int i = 0; i < n; i ++)
{
if(a[i] == sum) cnt ++;
}
if(cnt == 0) cout << 1 << endl;
else if(cnt % 2 == 0) cout << cnt / 2 << endl;
else cout << cnt / 2 + 1 << endl;
}
return 0;
}
G - Matrix
题目大意
设一个二维数组,它的值只能为0或1,刚开始都是0,遍历所有位置,将它本身以及行数和列数都是它行列的倍数的位置变成1 - c(c为原来的值)。
求最后数组中1的个数。
解题思路
这是一道数学规律题,通过打出15 * 15的矩阵,可以得出每行1,4,9,16的位置是1,所以1位置之前有1个1,3位置之前有2个1,8位置之前有3个1,15位置之前有4个1,由此得出sqrt(n)和这几个数的联系。得出n
位置之前有sqrt(n)个1,列上的情况同理。
所以最后1的个数为sqrt(n)* sqrt(m);
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int Map[10][10];
int main()
{
int t;
long long n, m;
cin >> t;
while(t --){
cin >> n >> m;
long long sum = (long long int)sqrt(n) * (long long int)sqrt(m);
cout << sum << endl;
}
}
L - Swimmer (水题)
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6+10;
ll v[N];
int main()
{
ll n,m,q;
scanf("%lld%lld%lld",&n,&m,&q);
for(int i=1;i<=n;i++) scanf("%lld",&v[i]);
ll p,k;
for(int i=0;i<q;i++)
{
scanf("%lld%lld",&p,&k);
ll V = v[k];
ll len = V*p;
ll cnt = len/m;
ll ans;
if(len>m) ans = len%m;
else ans = len;
if(cnt%2==0)
printf("%lld\n",ans);
else
printf("%lld\n",m-ans);
}
return 0;
}