考完试cf复健感觉自己啥都不会写了 虽然之前本来就很菜
A. Juggling Letters
题目思路
一个水题 直接统计所有字母出现次数 如果存在模n不为0的字母 就输出no 不存在就输出yes
ac代码
#include
<stdio
.h
>
#include
<iostream
>
#include
<algorithm
>
#include
<math
.h
>
#include
<string
.h
>
#include
<vector
>
#include
<stack
>
#include
<queue
>
#include
<map
>
#include
<set>
#include
<utility
>
#define pi
3.1415926535898
#define ll long long
#define lson rt
<<1
#define rson rt
<<1|1
#define eps
1e-6
#define
ms(a
,b
) memset(a
,b
,sizeof(a
))
#define
legal(a
,b
) a
&b
#define print1
printf("111\n")
using namespace std
;
const int maxn
= 1e6+10;
const int inf
= 0x3f3f3f3f;
const ll llinf
= 0x3f3f3f3f3f3f3f3f;
const ll mod
= 1000000007;
int mp
[30];
char str
[1005];
int
main()
{
int t
;
scanf("%d",&t
);
while(t
--)
{
int n
;
scanf("%d",&n
);
for(int i
=0;i
<=30;i
++)mp
[i
]=0;
for(int i
=1;i
<=n
;i
++)
{
scanf("%s",str
);
int len
=strlen(str
);
for(int i
=0;i
<len
;i
++)
{
int tem
=str
[i
]-'a';
mp
[tem
]++;
}
}
int flag
=0;
for(int i
=0;i
<=30;i
++)
{
if(mp
[i
]%n
!=0)flag
=1;
}
if(flag
==1)
printf("NO\n");
else
printf("YES\n");
}
}
B. Power Sequence
这道题一开始写了好久发现思路错了 然后看了下题解思路 重新写写了好久才a
题目思路
根据题目意思 我们可以先对数组从小到大排序 我们可以处理出每个位置上最接近的c 然后维护最小的作为c的起始值 有题目知道我们要求的是Σ(数组第i位-c的i次方)的最小值 我们可以暴力搜索最小值 如果对于当前的c做求和的值大于当前最小值 那么之后的值也是一定大于当前最小值的 所以我们舍去后面那一段就行了
ac代码
#include
<stdio
.h
>
#include
<iostream
>
#include
<algorithm
>
#include
<math
.h
>
#include
<string
.h
>
#include
<vector
>
#include
<stack
>
#include
<queue
>
#include
<map
>
#include
<set>
#include
<utility
>
#define pi
3.1415926535898
#define ll long long
#define lson rt
<<1
#define rson rt
<<1|1
#define eps
1e-6
#define
ms(a
,b
) memset(a
,b
,sizeof(a
))
#define
legal(a
,b
) a
&b
#define print1
printf("111\n")
using namespace std
;
const int maxn
= 1e5+10;
const int inf
= 0x3f3f3f3f;
const ll llinf
= 0x3f3f3f3f3f3f3f3f;
const ll mod
= 1000000007;
ll a
[maxn
];
int
main()
{
int n
;
scanf("%d",&n
);
for(int i
=1;i
<=n
;i
++)
scanf("%lld",&a
[i
]);
sort(a
+1,a
+1+n
);
ll ans
=1e18;
ll tem
=a
[1]-1;
for(int i
=2;i
<=n
;i
++)
tem
=min(tem
,(long long
)pow(a
[i
],1.0/i
-1));
while(1)
{
ll temp
=0;
ll x
=1;
for(int i
=1;i
<=n
;i
++)
{
temp
+=abs(a
[i
]-x
);
x
*=tem
;
if(temp
>=ans
)break;
}
if(temp
<ans
)
ans
=temp
;
else
break;
tem
++;
}
printf("%lld\n",ans
);
}
C. Multiples of Length
这题真是完全没思路 之前就不怎么会做构造题 看着题目发了将近20分钟呆
题目思路
对于构造体来说一般都是直接对整体做操作 先对情况分类 当n=1时 三次操作 一次用来让a[1]=0 剩下两次输出0就好了 当n!=1时 第一次也是直接让a[1]=0 第二次则是让2到n上每个数减去n*a[i],但是这样不符合题目的要求 所以要加上第一位 然后对应位置输出0就好了 第三次就是对2到n上每个数加上(n-1)*a[i] 这样就能讲整个数组变为0了 一个非常巧妙的思路
ac代码
#include
<stdio
.h
>
#include
<iostream
>
#include
<algorithm
>
#include
<math
.h
>
#include
<string
.h
>
#include
<vector
>
#include
<stack
>
#include
<queue
>
#include
<map
>
#include
<set>
#include
<utility
>
#define pi
3.1415926535898
#define ll long long
#define lson rt
<<1
#define rson rt
<<1|1
#define eps
1e-6
#define
ms(a
,b
) memset(a
,b
,sizeof(a
))
#define
legal(a
,b
) a
&b
#define print1
printf("111\n")
using namespace std
;
const int maxn
= 1e5+10;
const int inf
= 0x3f3f3f3f;
const ll llinf
= 0x3f3f3f3f3f3f3f3f;
const ll mod
= 1000000007;
ll a
[maxn
];
int
main()
{
int n
;
scanf("%d",&n
);
for(int i
=1;i
<=n
;i
++)
scanf("%lld",&a
[i
]);
if(n
!=1)
{
printf("1 1\n");
printf("%d\n",-1*a
[1]);
printf("1 %d\n",n
);
for(int i
=1;i
<=n
;i
++)
{
if(i
==1)printf("0");
else printf(" %lld",-1*a
[i
]*n
);
}
printf("\n2 %d\n",n
);
for(int i
=2;i
<=n
;i
++)
{
printf("%lld ",a
[i
]*(n
-1));
}
printf("\n");
}else
{
printf("1 1\n");
printf("%lld\n",-1*a
[1]);
printf("1 1\n");
printf("0\n");
printf("1 1\n");
printf("0\n");
}
}
d题待补