[GDOI2014] 世界杯&[AHOI2001] 彩票摇奖&[NOIP2009 普及组] 分数线划定

[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] 彩票摇奖

题目描述(复制的题目可能有错,请用你手头上的)

为了丰富人民群众的生活、支持某些社会公益事业,北塔市设置了一项彩票。该彩票的规则是:

  1. 每张彩票上印有 77 个各不相同的号码,且这些号码的取值范围为 1∼331∼33。
  2. 每次在兑奖前都会公布一个由七个各不相同的号码构成的中奖号码。
  3. 共设置 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了

  • 40
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值