[GDOI2014] 世界杯de题目描述(复制的题目可能有错,请用你手头上的)
3014 年世界杯足球赛就要开始了!作为卫冕冠军中国足球队的教练,手下每位球员都是猛将,如何摆出最强的 11 人阵容也是一件幸福的烦恼事啊。
众所周知,足球阵容里的11个球员都会被分配到场上某一个特别的位置,而这些位置主要分为守门员、后卫、中场和前锋四种,其中守门员有且只有一个,后卫、中场和前锋的人数取决于你安排的足球阵型。形容足球阵型的方法由后卫开始计算至前锋,但不把守门员计算在内。例如,3-5-2 阵型是指有三个后卫、五个中场及两名前锋。由于竞争激烈,每位球员只会培养其中一种位置所需要的技能,所以他们每个人都只能胜任四个位置中的其中一种。
作为一个对球员能力了如指掌的教练,你给每个球员的综合水平进行量化。为了将阵型安排得更好,你的教练团队决定使用以下策略安排球员:首先按照顺序提出 𝑄Q 个阵型,分别代表第一阵型、第二阵型、……、第 𝑄Q 阵型。然后对于每个阵型,从仍未选择的球员中选择最好的对应数量的守门员、后卫、中场和前锋。比如说,对于第一阵型,在所有球员中选择;对于第二阵型,在除了第一阵型外的所有球员中选择;对于第三阵型,在除了第一阵型和第二阵型外的所有球员中选择;以此类推。
现在 𝑄Q 个阵型都已经确定,而你需要知道的,是每个阵型的平均综合水平分别是多少。
输入格式
第一行有四个整数 𝐾,𝐷,𝑀,𝐹K,D,M,F,分别表示守门员、后卫、中场和前锋供挑选的球员人数。
第二行有 𝐾K 个整数 𝑘𝑖ki,分别表示每个守门员的综合水平值。
第三行有 𝐷D 个整数 𝑑𝑖di,分别表示每个后卫的综合水平值。
第四行有 𝑀M 个整数 𝑚𝑖mi,分别表示每个中场的综合水平值。
第五行有 𝐹F 个整数 𝑓𝑖fi,分别表示每个前锋的综合水平值。
第六行有一个整数 𝑄Q,表示教练团队提出的阵型个数。
以下 𝑄Q 行,第 𝑖i 行三个整数 𝐴𝑖,𝐵𝑖,𝐶𝑖Ai,Bi,Ci,由空格间隔,表示第 𝑖i 阵型是 𝐴𝑖−𝐵𝑖−𝐶𝑖Ai−Bi−Ci 阵型。
输出格式
输出 𝑄Q 行。对于第 𝑖i 种阵型,输出一个实数,表示该阵型平均综合水平的最大值,并四舍五入到小数点后 22 位。
输入输出样例
输入 #1复制
3 10 12 4 76 60 87 78 84 84 84 81 82 72 51 77 57 85 84 62 87 88 64 81 90 80 66 88 85 65 83 63 79 2 4 5 1 4 4 2
输出 #1复制
85.64 78.00
说明/提示
对于 30%30% 数据,𝐾,𝐷,𝑀,𝐹≤1000K,D,M,F≤1000,𝑄≤10Q≤10;
对于 100%100% 数据,1≤𝐾,𝐷,𝑀,𝐹≤1051≤K,D,M,F≤105,0≤𝑘𝑖,𝑑𝑖,𝑚𝑖,𝑓𝑖≤1080≤ki,di,mi,fi≤108,1≤𝑄≤𝐾1≤Q≤K,0≤𝐴𝑖,𝐵𝑖,𝐶𝑖≤100≤Ai,Bi,Ci≤10,𝐴𝑖+𝐵𝑖+𝐶𝑖=10Ai+Bi+Ci=10,∑𝐴𝑖≤𝐷∑Ai≤D,∑𝐵𝑖≤𝑀∑Bi≤M,∑𝐶𝑖≤𝐹∑Ci≤F
我将用我第一次提交的思路讲给你听 10分程序:
see 范围
10^5的范围 一定不会超! 往死里打!
#include<bits/stdc++.h>
using namespace std;
bool cmp(int a,int b)//懒得算 自己打一个从大到小排序
{
return a>b;
}
int a[100005],b[100005],c[100005],d[100005];
int bf,cf,df,an,bn,cn,dn,g,bs,cs,ds,as,x;
int main()
{
cin>>an>>bn>>cn>>dn;
for(int i=1;i<=an;i++)cin>>a[i];//往死里打!
for(int i=1;i<=bn;i++)cin>>b[i];//往死里打!
for(int i=1;i<=cn;i++)cin>>c[i];//往死里打!
for(int i=1;i<=dn;i++)cin>>d[i];//往死里打!
sort(a+1,a+1+an,cmp);//往死里排序!
sort(b+1,b+1+bn,cmp);//往死里排序!
sort(c+1,c+1+cn,cmp);//往死里排序!
sort(d+1,d+1+dn,cmp);//往死里排序!
cin>>g;
while(g--)
{
x++;//第一次出现第2次就不能再出现了(审题了但不多 数据可以不一样啊!)
cin>>bf>>cf>>df; as=a[x];
for(int i=bf*(x-1)+1;i<=bf*x;i++)bs+=b[i];
for(int i=cf*(x-1)+1;i<=cf*x;i++)cs+=c[i];
for(int i=df*(x-1)+1;i<=df*x;i++)ds+=d[i];
printf("%.2f\n",(as+bs+cs+ds)*1.0/11.0);
bs=0; cs=0; ds=0;
}
return 0;
}
变量解释
an bn cn dn 守门多少个 前锋多少...
a b c d守门前锋等数组
af,bf,cf取前?个
为什么会出现如上代码(怎么想的)
要求最大 那么我们读入 守门前锋等数组
在一次次阵型个数选出前几名
问题是:我没审题...
所以ALL AC就是
#include<bits/stdc++.h>
using namespace std;
bool cmp(int a,int b)
{
return a>b;
}
int a[100005],b[100005],c[100005],d[100005];
int bf,cf,df,an,bn,cn,dn,g,bs,cs,ds,as,bi=1,ci=1,di=1,ai;
int main()
{
cin>>an>>bn>>cn>>dn;
for(int i=1;i<=an;i++)cin>>a[i];
for(int i=1;i<=bn;i++)cin>>b[i];
for(int i=1;i<=cn;i++)cin>>c[i];
for(int i=1;i<=dn;i++)cin>>d[i];
sort(a+1,a+1+an,cmp);
sort(b+1,b+1+bn,cmp);
sort(c+1,c+1+cn,cmp);
sort(d+1,d+1+dn,cmp);
cin>>g;
while(g--)
{
cin>>bf>>cf>>df; as=a[++ai];
for(int i=bi;i<=bf+bi-1;i++)bs+=b[i];
for(int i=ci;i<=cf+ci-1;i++)cs+=c[i];
for(int i=di;i<=df+di-1;i++)ds+=d[i];
printf("%.2f\n",(as+bs+cs+ds)*1.0/11.0);
bs=0; cs=0; ds=0;
bi+=bf; ci+=cf; di+=df;
}
return 0;
}
[AHOI2001] 彩票摇奖
题目描述(复制的题目可能有错,请用你手头上的)
为了丰富人民群众的生活、支持某些社会公益事业,北塔市设置了一项彩票。该彩票的规则是:
- 每张彩票上印有 77 个各不相同的号码,且这些号码的取值范围为 1∼331∼33。
- 每次在兑奖前都会公布一个由七个各不相同的号码构成的中奖号码。
- 共设置 77 个奖项,特等奖和一等奖至六等奖。
兑奖规则如下:
- 特等奖:要求彩票上 7 个号码都出现在中奖号码中。
- 一等奖:要求彩票上有 6 个号码出现在中奖号码中。
- 二等奖:要求彩票上有 5 个号码出现在中奖号码中。
- 三等奖:要求彩票上有 4 个号码出现在中奖号码中。
- 四等奖:要求彩票上有 3 个号码出现在中奖号码中。
- 五等奖:要求彩票上有 2 个号码出现在中奖号码中。
- 六等奖:要求彩票上有 1 个号码出现在中奖号码中。
注:兑奖时并不考虑彩票上的号码和中奖号码中的各个号码出现的位置。例如,中奖号码为 23 31 1 14 19 17 1823 31 1 14 19 17 18,则彩票 12 8 9 23 1 16 712 8 9 23 1 16 7 由于其中有两个号码(23 和 1)出现在中奖号码中,所以该彩票中了五等奖。
现已知中奖号码和小明买的若干张彩票的号码,请你写一个程序帮助小明判断他买的彩票的中奖情况。
输入格式
输入的第一行只有一个自然数 𝑛n,表示小明买的彩票张数;
第二行存放了 7 个介于 1 和 33 之间的自然数,表示中奖号码;
在随后的 𝑛n 行中每行都有 7 个介于 1 和 33 之间的自然数,分别表示小明所买的 𝑛n 张彩票。
输出格式
依次输出小明所买的彩票的中奖情况(中奖的张数),首先输出特等奖的中奖张数,然后依次输出一等奖至六等奖的中奖张数。
输入输出样例
输入 #1复制
2 23 31 1 14 19 17 18 12 8 9 23 1 16 7 11 7 10 21 2 9 31
输出 #1复制
0 0 0 0 0 1 1
说明/提示(数据规模与约定)
对于 100%100% 的数据,保证 1≤𝑛<10001≤n<1000。
ALL AC
#include<bits/stdc++.h>
using namespace std;
int g,a[15],x,zj[15],ans;
int main()
{
cin>>g;
for(int i=1;i<=7;i++)cin>>a[i];
while(g--)
{
for(int i=1;i<=7;i++)
{
cin>>x;
for(int j=1;j<=7;j++)if(x==a[j]){ans++;break;}
}
zj[7-ans+1]++;ans=0;
}
for(int i=1;i<=7;i++)cout<<zj[i]<<" ";
return 0;
}
变量解释:
g 小明买的G张彩票
a 中奖号码数组
zj 统计中了几等奖 zj(中奖)
思路分析:
2
23 31 1 14 19 17 18 中奖数组
12 8 9 23 1 16 7
11 7 10 21 2 9 31
来到第2行 读入这个数(x)看看中奖有没有 有就不找了 本组彩票中奖号码+1(ans++)
循环外 读完7个数了
特等是zj[1]
1等是zj[2]
......(以此类推)
如果全中了 此时ans=7
特等是zj[1] 所以zj[7-ans+1]++;
在历遍看看中的奖项有没有
[NOIP2009 普及组] 分数线划定
题目描述(复制的问题此处不纠正 请用您手上的)
世博会志愿者的选拔工作正在 A 市如火如荼的进行。为了选拔最合适的人才,A 市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试分数线根据计划录取人数的 150%150% 划定,即如果计划录取 𝑚m 名志愿者,则面试分数线为排名第 𝑚×150%m×150%(向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于面试分数线的所有选手。
现在就请你编写程序划定面试分数线,并输出所有进入面试的选手的报名号和笔试成绩。
输入格式
第一行,两个整数 𝑛,𝑚(5≤𝑛≤50,3≤𝑚≤𝑛)n,m(5≤n≤50,3≤m≤n),中间用一个空格隔开,其中 𝑛n 表示报名参加笔试的选手总数,𝑚m 表示计划录取的志愿者人数。输入数据保证 𝑚×150%m×150% 向下取整后小于等于 𝑛n。
第二行到第 𝑛+1n+1 行,每行包括两个整数,中间用一个空格隔开,分别是选手的报名号 𝑘(1000≤𝑘≤9999)k(1000≤k≤9999)和该选手的笔试成绩 𝑠(1≤𝑠≤100)s(1≤s≤100)。数据保证选手的报名号各不相同。
输出格式
第一行,有 22 个整数,用一个空格隔开,第一个整数表示面试分数线;第二个整数为进入面试的选手的实际人数。
从第二行开始,每行包含 22 个整数,中间用一个空格隔开,分别表示进入面试的选手的报名号和笔试成绩,按照笔试成绩从高到低输出,如果成绩相同,则按报名号由小到大的顺序输出。
输入输出样例
输入 #1复制
6 3 1000 90 3239 88 2390 95 7231 84 1005 95 1001 88
输出 #1复制
88 5 1005 95 2390 95 1000 90 1001 88 3239 88
说明/提示
【样例说明】
𝑚×150%=3×150%=4.5m×150%=3×150%=4.5,向下取整后为 4。保证 4 个人进入面试的分数线为 88,但因为 88 有重分,所以所有成绩大于等于 88 的选手都可以进入面试,故最终有 5 个人进入面试。
NOIP 2009 普及组 第二题
ALL AC:
#include<bits/stdc++.h>
using namespace std;
struct work
{
int id,s;
}a[5005];
bool cmp(work a,work b)
{
if(a.s!=b.s)return a.s>b.s;
else return a.id<b.id;
}
int n,m,minx,peo;
int main()
{
cin>>n>>m;m=m*1.5;
for(int i=1;i<=n;i++)cin>>a[i].id>>a[i].s;
sort(a+1,a+1+n,cmp);
minx=a[m].s;peo=m;
for(int i=m+1;i<=n;i++)if(a[i].s==a[m].s)peo++;
cout<<minx<<" "<<peo<<endl;
for(int i=1;i<=peo;i++)cout<<a[i].id<<" "<<a[i].s<<endl;
return 0;
}
变量解释:
peo people(入选人数)
minx 入选最低分数线
为什么要这样写:
这题的样例我给满分 重分也有考虑
读入这个人的id(报名号) s(成绩)
因为排序的话要一起排 上结构体
struct work
{
int id,s;
}a[5005];
入选人数是m*1.5(m*150%=m*1.5)的向下取整
当这个m是int变量就是有小数就向下取整
m=m*1.5;
我们读完结构体按从成绩的从高到低排序(分数相等按id)
bool cmp(work a,work b)
{
if(a.s!=b.s)return a.s>b.s;
else return a.id<b.id;
}
sort(a+1,a+1+n,cmp);
取前m
先考虑同分
从m+1开始 看看是不是和a[m]的成绩同分 是的话人数+1(peo一开始=m)
for(int i=m+1;i<=n;i++)if(a[i].s==a[m].s)peo++;
最低分数线就是a[m]的成绩啦
minx=a[m].s;peo=m;
最后输出入选人数就ok了