目录:
T1:魔法阵~
T2:小biu放牛
T3:小A的游戏
T4:小biu闯关
……
T1:魔法阵~
分析:
可以得出 若想要切完还是正多边形 剩余的边数必然是
n
n
n的因数
所以我们直接枚举全部剩余边形的最大和就行了
CODE:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=20005;
int n,a[N],fac_num,sum,factor[N],maxn,k,fac_tot,edge,nowfac;
void count_fac(int x)
{
for(int i=2;i<x;i++)
if(x%i==0)
{
fac_num++;
factor[fac_num]=i; //统计因数
}
}
void tp()
{
if(fac_num==0||n==3) //特判
{
printf("%d",sum);
exit(0);
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
maxn=sum; count_fac(n); tp();
for(int i=0;i<fac_num;i++)
{
nowfac=factor[i];k=1;
while(nowfac--)
{
fac_tot=0;edge=0;
for(int j=k;j<=n;j+=factor[i])
{
fac_tot+=a[j];
edge++; //枚举nowfac边形的所有和
}
if(edge>=3)
maxn=max(maxn,fac_tot); //最大和
k++;
}
}
printf("%d",maxn);
return 0;
}
T2:小biu放牛
分析:
二分 贪心 来考虑放牛
通过输入计算牛的
h
e
a
d
head
head
t
a
i
l
tail
tail 再判断越界情况即可
CODE:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=1e6+5;
int n,m,x,a[N];
bool check(int p)
{
int head=0,tail=0;
for(int i=1;i<=n;i++)
{
head=max(tail,a[i]-x-p); //计算head位置
if(abs(head-a[i]+x)>p) return 0; //判越界
tail=head+2*x; //计算tail
if(tail>m) return 0; //判越界
}
return true;
}
int main(){
scanf("%d%d%d",&n,&x,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int l=0,r=m;
while(l<=r) //二分答案
{
int mid=(l+r)>>1;
if(check(mid)) r=mid-1;
else l=mid+1;
}
if(l==(m|1)) printf("-1"); //m+1
else printf("%d",l);
return 0;
}
T3:小A的游戏
分析:
如果无法判断 那必然是出现了重复的字母
我们可以发现一个性质:当第一对重复字母之间的距离
<
=
k
<=k
<=k时 就无法判断了
比如
S
=
"
S
A
S
S
"
S="SASS"
S="SASS"
k
=
2
k=2
k=2时 如果剩下
A
S
AS
AS 可以删去
1
,
3
1,3
1,3或
1
,
4
1,4
1,4所以无法判断
则第一对为
1
,
3
1,3
1,3 距离为
2
2
2 符合性质 所以不能判断
CODE:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,k,flag;
string s;
int main(){
scanf("%d",&n);
while(n--)
{
flag=0;
cin>>s;
scanf("%d",&k);
if(k==s.length()){
printf("Certain\n"); //特判
continue;
}
for(int i=0;i<s.length();i++)
{
for(int j=i+1;j<s.length();j++)
if(s[i]==s[j]) //重复字母
{
int dis=j-i; //距离
if(dis<=k)
{
flag=1;
printf("Uncertain\n");
break;
}
}
if(flag) break;
}
if(!flag)
printf("Certain\n");
}
return 0;
}
T4:小biu闯关
专门写一篇来讲
阿巴阿巴
总 结:
一般般 没打
T
2
T
4
T2T4
T2T4的部分分