开始: 2024-05-19 14:30:00

20240519

结束: 2024-05-19 17:30:00
当前: 2025-06-27 01:53:07  类型:单人排位赛 状态:已经结束 

A-跑步

#include <bits/stdc++.h>
using namespace std;
int t,n;
long long sum;
int main()
{
scanf("%d%d",&t,&n);
while(n--)
{
if(t<6) sum+=250;
if(t!=7) t++;
else t=1;
}
printf("%lld",sum);
return 0;
}

B-最小和

#include <bits/stdc++.h>
using namespace std;
int n,m;
int a[3010];
int ans;
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int now=0;
for(int i=1;i<=m;i++) now+=a[i];//先求出前m个数的权值和
ans=now;
for(int i=m+1;i<=n;i++)
{
now-=a[i-m];
now+=a[i];
ans=min(ans,now);
}
cout<<ans;
return 0;
}

C-单词分类

#include<bits/stdc++.h>
using namespace std;
long long i,n,sum,j,k;
string s[100010];
char t;
int main()
{
cin>>n;
for (i=1;i<=n;i++)
{
cin>>s[i];
sort(s[i].begin(),s[i].end());
//每一个字符串内部进行排序
}
sort(s+1,s+n+1);
//再将所有的字符串排序一次
for (i=1;i<=n;i++) if (s[i-1]!=s[i]) sum++;
//最后只需统计有多少个字符串互不相同
cout<<sum;
}

D-X进制

用高精度加法的思路,存入数组中后做竖式加法。

#include<bits/stdc++.h>
using namespace std;
map<char,int> m;
map<int,char> mm;
int n,c[2010],la,lb;
char a[2010],b[2010];
int main()
{
for(int i=0;i<=9;i++) m[i+'0']=i,mm[i]=i+'0';
for(int i=10;i<=36;i++) m[i-10+'A']=i,mm[i]=i-10+'A';
scanf("%d",&n); scanf("%s%s",a+1,b+1);
la=strlen(a+1); lb=strlen(b+1);
for(int i=1;i<=la/2;i++) swap(a[i],a[la-i+1]);
for(int i=1;i<=lb/2;i++) swap(b[i],b[lb-i+1]);
c[0]=max(la,lb);
for(int i=1;i<=c[0];i++)
{
c[i]+=m[a[i]]+m[b[i]];
if(c[i]>=n) c[i+1]+=c[i]/n,c[i]%=n;
}
if(c[c[0]+1]) c[0]++;
for(int i=c[0];i>=1;i--) printf("%c",mm[c[i]]);
return 0;
}

还有一种可能的想法是先转换到十进制,加了之后再转回去,参见2570题。但这道题中数据是高精度数据,即使转了十进制还是无法直接加,故最终还是需要高精度。

E-种田

贪心,每次都切一个边长为min(x,y)的正方形,然后将短的那一边减掉这个边长,答案加上边长*4即可,直到x和y中有一个为0就结束。

但这样的代码可能超时,因为一个一个切太慢了。发现每次可以切max(x,y)/min(x,y)个正方形,这样时间复杂度会大大减少。

#include<bits/stdc++.h>
using namespace std;
long long x,y,z,ans;
int main()
{
cin>>x>>y;
while(x!=0&&y!=0)
{
z=min(x,y);
if(x==z)
{
ans+=4*(y/z)*z;
y%=z;
}
else if(y==z)
{
ans+=4*(x/z)*z;
x%=z;
}
}
printf("%lld\n",ans);
return 0;
}