根据员工的投票和反馈,度度熊拿到了一份数据,表明在区域i种植园艺可以获得员工的满意度为Ai。
度度熊希望园艺的布置方案满足条件:
1.至少覆盖m个区域;
2.布置园艺的区域是连续的。
请帮他找到一种满足条件的方案,使布置园艺区域的员工的满意度的平均值最大。
输入描述
输入的第一行包含两个整数n和m,分别表示总区域数和至少覆盖的区域数。
第二行包含n个整数A0,A1,…,An–1,依次表示在每个区域种植园艺可以获得员工的满意度。
输出描述
输出一行,表示员工的平均满意度的最大值。
如果这个数是一个整数,则直接按整数格式输出;否则,请用最简分数表示,分子分母以“/”分割,格式见样例。
样例输入1
31
231
样例输入2
53
18248
样例输出1
3
样例输出2
11/2
15
提示
样例2的正确答案为11/2,尽管22/4数值也相同,但由于没有化简,所以是错误的。
对于100%的数据,1≤m≤n≤106,1≤Ai≤106。
2011XX之星B第二题:
数据还原
2011-06-1409:
23
第二题:
数据还原
度度熊近日开发出一种新型随机数生成算法,方法是使用一个质数P和n个非负整数A0,A1,…,An-1,生成第m个随机数的公式为
通过适当的选取参数Ai,度度熊发现这种随机数生成的方法具备一种神秘的性质,并帮助他完成了多项研究。
度度熊准备在一个新环境中进行他的下一次实验,他让他的助手去取他桌上写着n个整数A0,A1,…,An-1的纸条以产生新的随机数据,取回后度度熊发现助手取回的不是写着参数的纸条,而是他上一次实验时记录下来的随机数rands,rands+1,…,rands+n-1,而数的个数正好也是n个。
现在度度熊已经没有时间等他的助手再回去取写着参数的纸条了,你能帮度度熊生成接下来的x个随机数(即rands+n,rands+n+1,…,rands+n+x-1)让他继续他的实验么?
输入描述
输入的第一行包含4个非负整数n,P,s,x,相邻两个整数间用一个空格分隔。
第二行包含n个整数rands,rands+1,…,rands+n-1,表示度度熊上一次实验生成的随机数。
输出描述
输出一行,包含x个非负整数rands+n,rands+n+1,…,rands+n+x-1,相邻的两个整数间用一个空格分隔,表示接下来生成的x个随机数。
样例输入
410112
5174389
样例输出
6063
提示
对于100%的数据,1≤n,s,x≤1000,s+x
2011XX之星A第二题:
篮球场
2011-06-1409:
22
XX公司有一块长a米宽b米的矩形空地,空地的左上角坐标为(0,0),右下角坐标为(a,b)。
空地上长着n株灌木,每株灌木都非常小。
现在XX公司准备清理掉其中的一些灌木,在空地上修建两个长28米宽15米的篮球场。
球场必须完全修建在空地内部(边缘可以和空地的边缘重合)且球场边缘必须与空地边缘平行,两个篮球场不允许重叠(不考虑边缘)。
在清理灌木的时候,只有球场内部的灌木需要清理掉,球场外部和边缘的灌木不用清理。
请帮助XX公司找到一种球场的建设方案,使得需要清理的灌木最少。
注意:
在最优方案中球场的左上角坐标可能是实数。
输入描述
输入包含多组数据。
每组数据的第一行包含两个整数a、b,表示空地的长和宽。
第二行包含一个整数n,表示空地上灌木的数量。
接下来n行表示所有灌木的坐标,其中第i行包含两个整数xi、yi,表示第i个灌木的坐标为(xi,yi)。
最后一组数据之后的一行为两个0,表示输入结束。
输出描述
对于每组数据,输出一个整数,表示最少需要清理多少株灌木。
样例输入
5040
3
1117
2426
3620
00
样例输出
1
提示
空地、灌木和最优的球场修建方案如下图所示。
对于100%的数据,30≤a,b≤100,灌木的坐标都不相同。
2011XX之星B第一题代码
2011-06-1309:
47
#include"iostream"
#include"math.h"
usingnamespacestd;
voidMove(intn,intsign,int*Matrix)
{
inti;
for(i=1;i {
inttemp=Matrix[i];
intnext=i+1-sign;
if(next<0)
next=n+next;
elseif(next>n)
next=next-n;
Matrix[i]=Matrix[next];
Matrix[next]=temp;
}
}
voidmain()
{
intn=1;
while(n!
=0)
{
inta,b;
cin>>n>>a>>b;
int*Matrix=newint[n+1];
inti,j,sign;
for(i=1;i cin>>Matrix[i];
for(i=1;i {
if(Matrix[i]==1)
{
sign=i;
}
}
for(i=1;i {
inttemp=Matrix[i];
intnext=i+1-sign;
if(next<0)
next=n+next;
elseif(next>n)
next=next-n;
Matrix[i]=Matrix[next];
Matrix[next]=temp;
}
intlap=0;
boolOK=true;
for(i=1;i {
if(Matrix[i]!
=i)
{
for(j=1;j if(Matrix[j]==i)
{
lap=abs(j-i);
if(lap>=abs(a-b))
{
// Move(n,i-j,Matrix);
sign=i-j;
for(i=1;i {
inttemp=Matrix[i];
intnext=i+1-sign;
if(next<0)
next=n+next;
elseif(next>n)
next=next-n;
Matrix[i]=Matrix[next];
Matrix[next]=temp;
}
}
else
{
OK=false;
break;
}
}
}
}
delete[]Matrix;
if(OK)
cout<<"Yes";
else
cout<<"No";
}
2011XX之星B第一题
2011-06-1309:
46
XX爱好者(B)消息2011年6月11日,2011XX之星Astar2011程序设计大赛初赛打开大幕。
XX爱好者给大家带了初赛第二场的题目,供有兴趣的朋友研究。
初赛第一场共3题。
分别是圆环、数据还原、园艺布置。
第一题:
圆环
一个圆环上有n个位置,这n个位置按顺时针依次标号为1,2,…,n。
初始时圆环的每个位置上都有一个1至n之间的整数,且每个整数只出现一次。
任何时刻,你可以将圆环上的数全部逆时针旋转一个位置,即第i个位置上的数变为原来第i+1个位置上的数,第n个位置上的数变为原来第1个位置上的数。
也可以将圆环上的数全部顺时针旋转一个位置,即第i个位置上的数变为原来第i–1个位置上的数,第1个位置上的数变为原来第n个位置上的数。
另有一个装置,可以交换圆环上第a个位置和第b个位置上的数。
下图给出了三种操作的示例,圆环上有6个位置,初始数字分别为1,2,4,3,5,6,能交换第2个和第3个位置上的数。
经过一次逆时针旋转后变为2,4,3,5,6,1,交换后变为2,3,4,5,6,1,再经过一次顺时针旋转后变为1,2,3,4,5,6。
请问通过旋转和交换,能否使得第i个位置上的数正好是i。
输入描述
输入包含多组数据。
每组数据的第一行包含一个整数n,表示圆环上的数字个数。
第二行包含两个整数a,b(1≤a
接下来n行描述圆环上每个位置的初始值,其中第i行包含一个整数ai,表示初始时刻第i个位置上的数。
最后一组数据之后的一行为一个0,表示输入结束。
输出描述
对于每个测试用例,输出一行,如果能满足要求,这行中应只包含一个单词Yes,如果不能满足要求,这行中应只包含一个单词No。
样例输入
6
23
1
2
4
3
5
6
4
13
1
2
4
3
0
样例输出
Yes
No
提示
对于100%的数据,1≤n≤1,000。
2011XX之星第三题:
度度熊大战僵尸代码
2011-06-1309:
45
voidBubSort(int*InPut,intn)
{
inti,j;
boolout;
for(j=0;j {
for(i=0;i {
out=true;
if(InPut[i]>InPut[i+1])
{
intc=InPut[i];
InPut[i]=InPut[i+1];
InPut[i+1]=c;
out=false;
}
}
if(out)
break;
}
}
voidmain()
{
intn,k,t=1;
cin>>n>>k;
inti,j,h,m,w;
int*A=newint[n];
int*B=newint[n];
for(i=0;i {
cin>>A[i];
cin>>B[i];
}
int**weapon=newint*[n];
for(i=0;i weapon[i]=newint[k];
int*CutH=newint[k];
intcount=0;
boolnext=false;
for(t=1;t<=k;t++)
for(i=0;i {
weapon[i][t-1]=A[i]+B[i]*t;
if(count {
inttemp=A[i]+B[i]*t;
for(j=0;j<=count;j++)
{
if(temp==CutH[j])
{
j=count+1;
next=true;
}
}
if(!
next)
{
CutH[count]=temp;
count++;
next=false;
}
}
next=false;
}
BubSort(CutH,k-1);
next=false;
for(i=0;i for(j=0;j for(h=0;h for(m=0;m {
if(h!
=m)
{
inttemp=weapon[i][h]+weapon[j][m];
if(CutH[k-1]>temp)
{
for(w=0;w<=k-1;w++)
{
if(temp==CutH[w])
{
w=k+1;
next=true;
}
}
if(!
next)
{
CutH[k-1]=temp;
BubSort(CutH,k-1);
next=false;
}
}
}
next=false;
}
intresult=CutH[k-1];
delete[]CutH;
for(i=0;i delete[]weapon[i];
delete[]weapon;
cout<}
2011XX之星第三题:
度度熊大战僵尸
2011-06-1309:
44
第三题:
度度熊大战僵尸
僵尸最近老在XX大厦附近出没,因此公司派出了度度熊去消灭他。
度度熊有n件武器,第i件武器有物理攻击力Ai和魔法攻击力Bi。
在某个时刻t,武器能造成的伤害为Ai+Bi*t。
僵尸有一个初始血量值H,受到武器的攻击后,血量会减去武器的当前伤害值。
如果某个时刻僵尸的血量值为负,则僵尸将原地满血复活为血量值H。
因此为了消灭僵尸,度度熊的最后一击,必须恰好使僵尸的血量为0。
从时刻1开始的每个整数时刻,度度熊可以从自己的武器中挑选一个武器攻击僵尸一次,也可以不攻击僵尸。
一件武器可以在不同的时刻使用多次。
由于度度熊武器的限制,不是每个血量的僵尸都能杀死。
度度熊希望能知道能杀死的僵尸中第k小的血量值是多少。
输入描述
输入的第一行包含两个整数n,k,分别表示度度熊拥有的武器数和要求的血量是第几小的。
接下来n行表示度度熊拥有的武器,其中第i行包含两个整数Ai,Bi,表示第i个武器的物理和魔法攻击力。
输出描述
输出包含一个整数,表示度度熊能杀死的僵尸中第k小的血量值。
样例输入
28
13
35
样例输出
15
提示
度度熊能杀死的僵尸中前8小的血量值依次为4,7,8,10,11,13,14,15。
对于100%的数据,1≤n≤10,1≤k≤50,000,0≤Ai,Bi≤10,000。
VN:
F[1.9.4_1102]
2011XX之星第一题代码
2011-06-1309:
41
#include
usingnamespacestd;
voidno1()
{
intn,m;
cin>>n>>m;
intresult=0;
intcount=0,i=0,j=0;
intstyle=m;
int*source=newint[m];
int*Size=newint[m];
for(i=0;i cin>>source[i];
for(i=0;i n-=source[i];
if(n!
=0)
{
MessageBox(NULL,"InputerrorMatrix!
","Error",MB_OK);
return;
}
for(i=0;i {
for(j=0;j {
if(source[j]==1+i)
count++;
}
Size[i]=count;
count=0;
}
for(i=0;i {
style=0;
count+=Size[i];
for(j=0;j if(source[j]-i>0)
style++;
result+=style*(m-count);
}
cout< delete[]source;
2011XX之星第一题:
图标排列
2011-06-1309:
40
XX爱好者(B)消息2011年6月11日,2011XX之星Astar2011程序设计大赛初赛打开大幕。
XX爱好者给大家带了初赛第一场的题目,供有兴趣的朋友研究。
初赛第一场共3题。
分别是图标排列、篮球场、度度熊大战僵尸。
第一题:
图标排列
XX应用平台上有很多有趣的应用,每个应用都由一个开发者开发,每个开发者可能开发一个或多个应用。
XX的工程师们想把应用尽可能好的推荐给用户。
研究发现,同一个开发者开发的程序的图标有很大的相似性。
如果把同一个开发者开发的应用放在一起,用户很快就会厌倦相似的图标,如果把这些图标穿插摆放效果就会好很多。
现在工程师想给用户推荐来自m个开发者的n个应用,在推荐的时候这些应用的图标将排成整齐的一行展示给用户,相邻两个图标之间的距离正好是1,工程师们想让这些图标尽可能的穿插摆放。
为了衡量穿插摆放的效果,给每个图标定义一个“分离度”,分离度的值是指当前图标和它左边最近的来自同一个开发者的图标之间的距离。
如果一个图标左边没有来自同一个开发者的图标,则分离度为0。
所有图标穿插摆放效果的值定义为所有图标的分离度之和。
已知每个开发者开发的应用个数,请帮助XX的工程师找到图标穿插摆放效果的最大值。
输入描述
输入的第一行包含两个整数n和m,用一个空格分隔,分别表示应用的个数和开发者的个数。
第二行包含m个正整数,相邻两个数之间用一个空格分隔,表示每个开发者开发的应用个数,这些整数之和必然等于n。
输出描述
输出一个整数,表示图标穿插摆放效果的最大值。
样例输入
83
332
样例输出
15
提示
对于20%的数据,n≤10;
对于40%的数据,n≤100。
对于100%的数据,1≤m≤n≤100,000