A:托米的赌球
贪心,直接写一下就行了。
#include<bits/stdc++.h>
using namespace std;
#define LL long long int
#define lson rt<<1,l,m
#define rson rt<<1|1,m+1,r
int T;
int a,b;
int m[11]={100,50,20,10,5,2,1};
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&a,&b);
int p=0;
for(int i=0;i<7;i++)
{
if(p++) printf(" ");
if(m[i]<=a)
{
int cmp=0;
while(m[i]<=a) a-=m[i],cmp++;
printf("%d",cmp);
}
else
printf("0");
}
for(int i=1;i<7;i++)
{
if(p++) printf(" ");
if(m[i]<=b)
{
int cmp=0;
while(m[i]<=b) b-=m[i],cmp++;
printf("%d",cmp);
}
else
printf("0");
}
printf("\n");
}
return 0;
}
B:托米的划分
直接递归打表找规律就行了,能得到n的结果为0~n-1的和。
#include<bits/stdc++.h>
using namespace std;
#define LL long long int
#define lson rt<<1,l,m
#define rson rt<<1|1,m+1,r
int T;
LL n;
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%lld",&n);
LL res=(n-1)*n/2;
printf("%lld\n",res);
}
return 0;
}
C:托米的位运算
暴力枚举b序列与操作后的值,然后得到结果。
#include<bits/stdc++.h>
using namespace std;
#define LL long long int
#define lson rt<<1,l,m
#define rson rt<<1|1,m+1,r
int n;
int s[100100];
int num[100100];
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&num[i]);
LL base=0;
for(LL i=0;i<31;i++)
base|=(1LL<<i);
int cmp=0;
for(int i=30;i>=0;i--)
{
LL res=base;cmp=0;
for(int j=0;j<n;j++)
if(num[j]&(1LL<<i))
res=res&num[j],s[cmp++]=num[j];
int flag=(res&(-res))<(1LL<<i);
if(!flag) break;
}
printf("%d\n",cmp);
for(int i=0;i<cmp;i++)
{
if(i) printf(" ");
printf("%d",s[i]);
}
printf("\n");
return 0;
}
D:托米的咒语
emmm看了别人的代码发现直接暴力居然能过9!*3000的复杂度应该怎么也过不了的,应该是数据水了。
暴力代码:
#include<bits/stdc++.h>
using namespace std;
#define LL long long int
#define lson rt<<1,l,m
#define rson rt<<1|1,m+1,r
char a[]="abcdefghi";
char s[3030];
int main()
{
scanf("%s",s);
int len=strlen(s);
int res=0;
do{
int i=0,j=0;
while(i<9&&j<len)
{
if(a[i]==s[j])
i++,j++;
else j++;
}
if(i==9) res++;
}while(next_permutation(a,a+9));
printf("%d\n",res);
return 0;
}
标准写法: