准备省赛。
刚打完天梯赛第二天就开始干ACM的题,这些题质量不错,一小时做出三道题,团队4道。
简单题还是可以在很短的时间A出来,问题在于中档题那块,稍微偏难一点的、涉及更加复杂的模型的题,就很难下手了,先把做出来的三道题简单写一下。
牛客重现赛网址:https://ac.nowcoder.com/acm/contest/33486
M题:Tadokoro-Tono-Toe
题意:输入n,代表n×n的棋盘,三子棋赢的规则是,横竖斜三个字就赢了,问他可以赢吗?
分析:当然,只要n>3都有赢得策略。简单判断输出。
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >> t;
while(t--)
{
int n;
cin >> n;
if(n>3)
cout << "Yarimasune" << endl;
else
cout << "Unhuhhuhahhhhhhhh" <<endl;
}
return 0;
}
G题:Sakura Substring
题意:输出n,m意思是n个数长度的不大于m的正整数组成的数组,求连续段之间的差值最大和,并输出这个序列。
分析:每个段的差值最大就是m,数组即为0,m,0,m,0…,当然,需要特判一下n=1。
题解:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll p[100010];
int main()
{
p[1]=0;
for(int i=2;i<100001;i++)
p[i] = p[i-1]+i-1;
int n, m;
cin >> n >> m;
if(n==1)
{
cout << 0 << endl;
cout << 1 << endl;
return 0;
}
cout << p[n]*m << endl;
for(int i=0;i<n;i++)
{
if(i&1)
cout << 0 << " ";
else
cout << m << " ";
}
return 0;
}
L题:Yet Another Digital Demonstration
题意:一个九位数,可以有前导零,最少变换几位的数字,变成114514的倍数。
分析:我们可以找到所有的114514十位数以内的倍数,然后和数据一个一个比较,最后找出最小值。
题解:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
char s[11000][10];
int d[10][10];
int dp(char a[],char b[])
{
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
if(a[i]==b[i])
d[i][j] = d[i-1][j-1];
else
d[i][j] = d[i-1][j-1]+1;
}
}
return d[8][8];
}
void itooo(ll num, int i)
{
char pp[10];
int j=0;
while(num!=0)
{
pp[j++] = (num%10)+'0';
num/=10;
}
int k=0;
while(j--)
{
s[i][k++] = pp[j];
}
}
int main()
{
ll a = 114514;
for(int i=0;i<10000;i++)
{
ll num = a*i;
itooo(num,i);
int l = strlen(s[i]);
for(int j=l-1;j>=0;j--)
{
s[i][j+9-l] = s[i][j];
}
for(int j=0;j<9-l;j++)
{
s[i][j]='0';
}
}
int t;
cin >> t;
while(t--)
{
char st[10];
cin >> st;
int cnt=20;
for(int i=0;i<10000;i++)
{
if(cnt>dp(st,s[i]))
cnt = dp(st,s[i]);
}
cout << cnt << endl;
}
return 0;
}
F题: It’s all Shamiko’s fault
题意:比较黑色卡片和白色卡片哪个数值大,大的输出卡片总值×卡片数目。
分析:直接计数,比较,输出即可。
题解:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int t;
cin >> t;
while(t--)
{
int n;
int cntwhite=0;
int cntblack=0;
cin >> n;
int p;
for(int i=0;i<n;i++)
{
cin >> p;
cntwhite+=p;
}
for(int i=0;i<n;i++)
{
cin >> p;
cntblack+=p;
}
if(cntwhite>cntblack)
cout << cntwhite*n << endl;
else
cout << cntblack*n << endl;
}
return 0;
}