啊 菜鸡是后面补的题 看人家谁ac的多 然后 就开始慢慢的补题 嗯 直接上代码 应该都不是难题
这个是 A题
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <string.h>
using namespace std;
char p[105];
string slove(int ll)
{
// printf("%d\n",ll);
string ss;
ss.clear();
char ww[5];
int sum=0;
while(ll!=0)
{
ww[sum++]=ll%26+'a';
ll/=26;
}
while(sum<3)
ww[sum++]='a';
for(int i=sum-1;i>=0;i--)
ss+=ww[i];
return ss;
}
int main()
{
int t,len,ll;
string ss;
scanf("%d",&t);
while(t--)
{
ss.clear();
scanf("%d",&len);
scanf("%s",p);
for(int i=0;i<len;i+=5)
{
ll=0;
for(int j=i;j<=i+4;j++)
{
ll=ll*10+(p[j]-'0');
}
ss+=slove(ll);
}
cout<<ss<<endl;
}
return 0;
}
B题
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <string.h>
using namespace std;
int p[105];
int main()
{
int t,sum=0;
while(~scanf("%d",&t))
{
sum=0;
for(int i=0; i<t; i++)
scanf("%d",p+i);
for(int i=0; i<t; i++)
{
for(int j=i+1; j<t; j++)
{
if(p[i]*2==p[j])
sum++;
}
}
printf("%d\n",sum);
}
return 0;
}
然后下面的是 K题(第一求出来逆元 然后多mod 就行了)
#include<algorithm>
#include<string.h>
#include<stdio.h>
#define LL unsigned long long
using namespace std;
const LL mod=1000000007;
const LL niyuan=166666668;
int main()
{
LL n;
while(~scanf("%llu",&n))
{
LL u=(n%mod)*((n+1)%mod);
LL ans=(u%mod)*((2*n+1)%mod);
ans=(ans%mod*niyuan%mod)%mod;
printf("%llu\n",ans);
}
return 0;
}
C题有好多种解法 我想说的是两种 第一种是普通解法 但是会非常慢 巨慢 那种 本人不太建议的一种
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <string.h>
using namespace std;
int main()
{
unsigned long long int t,sum;
while(~scanf("%llu",&t))
{
sum=0;
while(t)
{
if(t&1)
sum++;
t/=2;
}
printf("%llu\n",sum);
}
return 0;
}
第二种 是利用位运算 & &的作用就是 当两个数字都为1的时候才为1 然后 我们要 想一想 人家要的是 一的 个数 每次去掉一个1 就好了 这样就降低了 复杂度 那么 我们每次都让 n&(n-1)比如 1111 那么减去1 就是 1110 结果就是 1110 如果是 1100 减去1就是 1011 那么答案就是1000 那么这样就可以写出程序
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <string.h>
using namespace std;
int main()
{
unsigned long long int t,sum;
while(~scanf("%llu",&t))
{
sum=0;
while(t)
{
t&=(t-1);
sum++;
}
printf("%llu\n",sum);
}
return 0;
}
D题 反正我是找的规律
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <string.h>
using namespace std;
int main()
{
long long int t;
while(~scanf("%lld",&t))
{
//
t=t-(long long int)sqrt(t);
printf("%lld\n",t);
}
return 0;
}
E题的话 就是一个向上取整还有向下取整 而且要加上原来变化的
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <string.h>
using namespace std;
//向下取整 floor
//向上取整ceil
int main()
{
int t,jin,jin1,yin,yin1,tong,tong1,sum,summ;
while(~scanf("%d",&t))
{
jin=floor(t*0.1);
jin1=ceil(t*0.1);
sum=jin1-jin;
yin=floor(t*0.2);
yin1=ceil(t*0.2);
summ=yin1-yin;
tong=floor(t*0.3);
tong1=ceil(t*0.3);
printf("%d %d %d\n",sum,sum+summ,tong1-tong+sum+summ);
}
return 0;
}
G题的话 数据结构了解一波???
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <queue>
using namespace std;
int p;
int main()
{
int n,ans,a,b;
while(~scanf("%d",&n))
{
priority_queue<int,vector<int>,greater<int> >pp;
ans=0;
for(int i=0;i<n;i++)
{
scanf("%d",&p);
pp.push(p);
}
while(!pp.empty())
{
a=pp.top();
pp.pop();
if(!pp.empty())
{
b=pp.top();
pp.pop();
}
else
break;
ans+=a+b;
pp.push(a+b);
}
printf("%d\n",ans);
}
return 0;
}