添加链接描述# A. Magical Sticks
题意:
给定长为
1
1
1~
n
n
n的木棍,任意连接,求最多能做多少根等长的木棍。
思路:
若
n
n
n为奇数,令前
n
n
n-
1
1
1根棍首尾相加,如:
1
1
1+
n
n
n-
1
1
1,
2
2
2+
n
n
n-
2
2
2、、、其和均为
n
n
n,即最多(
n
n
n/
2
2
2)+
1
1
1根等长木棍。 若
n
n
n为偶数,n根棍首位相加,共(
n
n
n/
2
2
2)根等长木棍。
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std
;
int main()
{
int t
;cin
>>t
;
while(t
--)
{
int n
;cin
>>n
;
if(n
%2) cout
<<(n
/2)+1<<endl
;
else cout
<<n
/2<<endl
;
}
}
B. Magical Calendar
题意:
给定
n
n
n天,
r
r
r(表示每周可以有的最大天数)。自定义每周天数
k
k
k(
1
<
=
k
<
=
r
1<=k<=r
1<=k<=r),制成方格表日历,需在方格表中连续涂满
n
n
n天,观察得到的不同图形个数并输出。
思路:
画图找规律可知:
k
<
n
k<n
k<n时,对首行来说可以从第
1
1
1~
k
k
k格开始填涂,故对于每个
k
k
k,都有
k
k
k种可能;
k
>
=
n
k>=n
k>=n时,
n
n
n格连续填在一行中,只有一种形状,即一种可能。 总数对
r
r
r种情况求和
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std
;
int main()
{
int t
;cin
>>t
;
while(t
--)
{
ll n
,r
;
cin
>>n
>>r
;
if(n
>r
)
cout
<<(1+r
)*r
/2<<endl
;
else cout
<<(1+n
-1)*(n
-1)/2+1<<endl
;
}
}
C. A Cookie for You
题意:
两种曲奇,数量分别为a,b,有两类人数量分别为n(选择数目多的那种曲奇),m(选择一个数目少的那种曲奇),每人选择一种曲奇,问是否每个人都能够拿到满意的曲奇。
思路:
当(a+b)<(n+m)时一定不满足; 当(a+b)>=(n+m) 时,先考虑m类人能否都能选到满意的曲奇,如果a,b中的最小值大于等于m,则每个人都能选到。
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std
;
int main()
{
int t
;cin
>>t
;
while(t
--)
{
ll a
,b
,n
,m
;
cin
>>a
>>b
>>n
>>m
;
if((a
+b
)<(n
+m
)) cout
<<"No"<<endl
;
else if(m
>min(a
,b
)) cout
<<"No"<<endl
;
else cout
<<"Yes"<<endl
;
}
}
D. Grid-00100
题意:
给定n,k,构造n*n的01矩阵,其中需包含k个1,令f=(最大行和−最小行和)2+(最大列和−最小列和)2,寻找f的最小值。
思路:
当k能被n整除时,可以使得每一行每一列个数相同,f(min)=0; 若不能被整除,对于余数r,把余数均分到每行后面,使得满足最大行和与最小行和相差1,最大列和与最小列和相差1,即f=1+1=2。
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std
;
int a
[305][305];
int main()
{
int t
;cin
>>t
;
while(t
--)
{ memset(a
,0,sizeof(a
));
int n
,k
;cin
>>n
>>k
;
if (k
%n
) cout
<<'2'<<endl
;
else cout
<<'0'<<endl
;
int p
=0;
for(int i
=1;i
<=k
/n
;i
++)
{
for(int j
=0;j
<n
;j
++)
a
[j
][(j
+p
)%n
]=1;
p
++;
}
if (k
%n
)
for(int i
=0;i
<k
%n
;i
++)
a
[i
][(i
+p
)%n
]=1;
for(int i
=0;i
<n
;++i
)
{
for(int j
=0;j
<n
;++j
)
cout
<<a
[i
][j
];
cout
<<endl
;
}
}
}
E1. Asterism (Easy Version)
题意:
有一个初始值x,一个含n个数的数组,x与ai从a1~an按顺序进行比较,若x>=ai,x++;数组中数可以任意排列,使比较过程中一直有x>=ai,令f(x)为满足条件的数组情况数,给定质数p,求满足 f(x)%p !=0的x
思路:
先对数组a排序,对x的情况进行讨论:
若x+n-1<a
max,f(x)=0,不满足;若x>=a
max,f(x)=n!(p<n),即f(x)%p=0,不满足;对a
max-n+1<=x<a
max,枚举x,计算f(x): 贪心,从大到小选位置
ai<=x,位置任意,即自乘ans(当前剩余位置数)ai>x:
x+ans(当前x可达到最大值)<=ai,无法构成有效数组否则,自乘ai可选择位置数(x+ans-ai)
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std
;
int n
,p
;
int a
[2005],b
[2005];
bool fun(int x
)
{
int res
=1,ans
=n
;
for(int i
=n
;i
>=1;--i
)
{
if(a
[i
]<=x
)
res
=res
*ans
%p
;
else if(x
+ans
<=a
[i
])
return 0;
else res
=res
*(x
+ans
-a
[i
])%p
;
ans
--;
}
if(res
==0)
return 0;
else return 1;
}
int main()
{
cin
>>n
>>p
;
for(int i
=1;i
<=n
;++i
)
cin
>>a
[i
];
sort(a
+1,a
+n
+1);
for(int i
=max(1,a
[n
]-n
+1);i
<a
[n
];++i
)
{
if(fun(i
))
{
b
[0]++;b
[b
[0]]=i
;
}
}
cout
<<b
[0]<<endl
;
if(b
[0]!=0)
{
for(int i
=1;i
<=b
[0];++i
)
cout
<<b
[i
]<<' ';
}
}