Contest2666 - 2021ACM俱乐部后备营个人训练赛第9场
问题 A: 6174问题
思路
四位数拆分,开两个数组a,b,用来存拆分出来的个、十、百、千位上的数,然后,sort快排(从小到大),再自个写个cmp(从大到小),定义maxx,minx,分别存最大的数和最小的数,与前一个数进行比较,相等则输出,不想等,则继续。
代码
#include <bits/stdc++.h>
using namespace std;
bool cmp(int a,int b)
{
return a>b;
}
void func(int m,int a[],int b[])
{
int count=0,maxx=-1,minx=0;
while(1)
{
sort(a,a+4,cmp);
sort(b,b+4);
maxx=a[0]*1000+a[1]*100+a[2]*10+a[3];
minx=b[0]*1000+b[1]*100+b[2]*10+b[3];
++count;
if(m==(maxx-minx))
{
cout<<count<<"\n";
break;
}
else
{
m=maxx-minx;
a[0]=m/1000;
a[1]=(m%1000)/100;
a[2]=(m%100)/10;
a[3]=m%10;
b[0]=a[0];
b[1]=a[1];
b[2]=a[2];
b[3]=a[3];
}
}
}
int main()
{
int n,m,a[4],b[4];
cin>>n;
while(n--)
{
cin>>m;
a[0]=m/1000;
a[1]=(m%1000)/100;
a[2]=(m%100)/10;
a[3]=m%10;
b[0]=a[0];
b[1]=a[1];
b[2]=a[2];
b[3]=a[3];
func(m,a,b);
}
return 0;
}
问题 B: 卖股票
思路
千万别开数组,我一开始开了两个1000005的数组做的,不出意外运行错误了三次(在线自闭)。卡了几乎半小时后换了思路。
边读边处理数据,并定义differ来存储最大的差值,即笨笨的每股股票最多能赚的钱,同时比较读入的数与上一个数的大小
代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,minprice,price;
int differ=0;
cin>>n;
cin>>minprice;
while(--n)
{
cin>>price;
if(differ<price-minprice)
differ=price-minprice;
if(minprice>price)
minprice=price;
}
cout<<differ;
return 0;
}
问题 E: 统计字数
思路
有手就行。读入一行字符,所以用了getline(cin,s);
代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
int e=0,n=0;
getline(cin,s);
for(int i=0;i<s.size();++i){
if(s[i]>='a'&&s[i]<='z' || s[i]>='A'&&s[i]<='Z')
++e;
if(s[i]>='0'&&s[i]<='9')
++n;
}
cout<<e<<" "<<n;
return 0;
}
问题 F: 整数拆分
思路
取子串,有点类似第八场的E题,但是主要特判首位置为 0 的情况。其他基本就是string类函数的调用,不会的去学c++——string类基础详解
代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s,a,temp;
cin>>s>>a;
int count=0;
for(int i=0;i<s.size();i++)
{
for(int j=1;j<=s.size()-i;j++)
{
if(s[i]!='0')
{
temp=s.substr(i,j);
if(temp.size()>a.size())
++count;
if(temp.size()==a.size() && temp.compare(a)>0)
++count;
}
}
}
cout<<count;
return 0;
}
问题 I: 数列计算VI
思路
开一个数组,每一个数都是它前面相邻四个数字之和的个位数字.
代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int ans=0,a[20];
a[0]=1;
a[1]=9;
a[2]=8;
a[3]=7;
for(int i=4;i<n;++i)
a[i]=(a[i-1]+a[i-2]+a[i-3]+a[i-4])%10;
for(int i=0;i<n;++i)
{
cout<<a[i]<<" ";
ans += a[i];
}
cout<<endl<<ans;
return 0;
}
问题 J: 海淀排序
思路
开数组,写个cmp(从大到小)sort快排,比较,输出下标。
代码
#include <bits/stdc++.h>
using namespace std;
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int n,m;
cin>>n;
int a[16];
for(int i=1;i<=n;++i)
cin>>a[i];
sort(a+1,a+n+1,cmp);
cin>>m;
for(int i=1;i<=n;++i)
if(m>=a[i])
{
cout<<i;
break;
}
return 0;
}
问题 K: 猜数
思路
三位数拆分,遍历。
代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,i;
cin>>n;
int ans,a=0,b=0,c=0;;
int ge,shi,bai;
for(int i=1;i<=n;++i)
{
ge=i%10;
shi=(i%100)/10;
bai=i/100;
if(ge==2)
++a;
if(shi==2)
++b;
if(bai==2)
++c;
}
ans = a+b+c;
cout<<ans;
return 0;
}
问题 L: Haiku
思路
有手就行,这篇可能是考英文(英文题目,呜呜呜)。
代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin>>s;
for(int i=0;i<s.size();++i)
if(s[i]==',')
s[i]=' ';
cout<<s;
return 0;
}
问题 M: Sum of Three Integers
思路
同样也是英文题目,有点像c语言课后题,最直接的三个for循环,暴力解,但是在这里会时间超限(别问我为啥知道,问就是我已干过了),所以我们需要优化掉最后一层循环。
代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
int k,s;
int i,j,l;
cin>>k>>s;
long long count=0;
for(i=0;i<=k;++i)
for(j=0;j<=k;++j)
if(s-i-j>=0&&s-i-j<=k)
++count;
cout<<count;
return 0;
}