郑州大学“战役杯”第一次比赛题解

1 我的账本

当前疫情防控形势严峻,学校为了减少同学们因为吃饭造成的聚集,规定一个寝室每次派个代表出去买饭,小W寝室的6人(编号1-6)决定每次抽签派一个人去买6份同样的套餐。但是每次买完饭后立刻转账又比较麻烦,于是他们约定每次去买饭的人先垫付,等疫情结束后再统一结算。

现在给你宿舍封闭管理期间的n顿饭中每次买饭人的序号和每份饭的单价,问疫情结束后每个人关于饭钱的收支状况?

输入格式:

第一行一个正整数n,表示有n顿饭
下面n行,第i行两个正整数x,y表示第i顿饭由x去买饭,每份饭单价y元。

输出格式:

一行六个整数表示每个人欠别人的钱或者别人欠他的钱。
如果他欠了别人钱,输出负数。
如果别人欠他的钱,输出正数 。

输入样例:

3
1 5
2 10
3 5

输出样例:

10 40 10 -20 -20 -20

注意行末不能有多余空格

样例解释1

1号欠2号5元,不欠3号,4号、5号、6号各欠1号5元,故1号输出10
1号、3号欠2号5元,4号、5号、6号各欠2号10元,故2号输出40
3号与1号同理
4号欠1号5元,欠2号10元,欠3号5元,故4号为-20
5号、6号与4号同理

数据范围与提示

1≤n≤21
1≤x≤6
4≤y≤15

源代码

map对应存储 

#include <iostream>
#include <map>//map容器对应存储 
using namespace std;
map<int,int> NUM;
int main()
{
	//依次存储1号-6号室友的钱钱状况 
    NUM[1]=0;
    NUM[2]=0;
    NUM[3]=0;
    NUM[4]=0;
    NUM[5]=0;
    NUM[6]=0;
    int n;
    cin>>n;
    while(n--)
    {
        int num,money;//输入对应号码和钱钱 
        cin>>num>>money;
        //当某个大怨种买饭时,其与室友除了他本身都欠他一顿饭钱 
        for(int i = 1;i <= 6;i ++ )
        {
            if(i==num)NUM[i]+=money*5;//加上大怨种的所应收的欠款 
            else NUM[i]-=money;//其余室友加上所欠钱钱(负数) 
        }
    }
    //从1号-6号依次输出每个人的钱钱状况 
    for(int i = 1;i <= 6;i ++ )
    {
        if(i==1)cout<<NUM[i];
        else cout<<' '<<NUM[i];
    }
    //注意格式的调整即末尾无空格 
    return 0;
}

 2 核酸检测扫码

受疫情影响,小明同学现在每天需要下楼进行核酸检测。检测时,需要先用郑好办 APP 扫描二维码并填写个人信息以便统计核酸检测结果。

小明对于二维码的构造很是好奇。据了解,二维码中的黑白可以用来表示二进制中的 0/1 。且二维码的左上角,右上角,左下角有三个形态固定的特殊方阵,用做扫码时的位置标定。通过确定这三个特殊方阵的位置,进而确定整个二维码图形在照片中的位置。除了这三个特殊方阵外,其他位置的 0/1 取值由特定方法产生,表示扫描二维码后的交互动作内容。

小明现在重点关注二维码图像中的特殊方阵,想定位仅有的三个特殊方阵。为了简化问题,你可以将二维码视为n∗m的 01 方阵,将用于标定的特殊方阵视为 8×8 的方阵,其形态如下:

11111111
10000001
10111101
10111101
10111101
10111101
10000001
11111111

现在为了安全起见,二维码标定用的三个特殊矩阵不再位于原方阵的三个角上,而是随机的分布在原方阵内(仍然保证特殊方阵之间不会相互重叠),请你找出这三个特殊方阵的位置(每个特殊方阵左上角的坐标)。

输入格式:

第一行n m,表示二维码对应01矩阵的大小(0<n,m≤1000)
第二行起,给出n行m列的01矩阵

输出格式:

输出共 3 行,每行两个整数,分别代表一个特殊方阵左上角所位于的行编号和列编号(行编号从上向下数分别是 0, 1, 2, 3, ...;列编号从左向右数分别是 0, 1, 2, 3, ...)。三组坐标将行编号作为第一关键字,列编号作为第二关键字升序排序后输出。

输入样例:

20 20
11111111100111111111
10000001011010000001
10111101111110111101
10111101111110111101
10111101111110111101
10111101000010111101
10000001101110000001
11111111001111111111
11111000110000010111
11110000011100010010
00111011000101011101
00110011010001110001
11111111100010100000
10000001110101001101
10111101010100000101
10111101010111100000
10111101000011111001
10111101001111001001
10000001111100000011
11111111110110001001

输出样例:

0 0
0 12
12 0

源代码 

 图解

即遍历元素周围四个元素模块的右,下,和右下 

#include <iostream>
#include <vector>//动态数组存储解 
#include <algorithm>//调用sort函数用于动态结构体数组排序 
using namespace std;
struct idx//结构体存储解的坐标 
{
	int x,y;
};
vector<idx> A;//开辟动态数组 
const int N = 1000+10;
char g[N][N];//创建二维字符用于储存 
int cmp(struct idx &A,struct idx &B)//自定义cmp函数来对于sort排序依据重定义 
{
	if(A.x!=B.x)return A.x<B.x;//首先按照行升序排 
	else if(A.y!=B.y)return A.y<B.y;//行相同按照列升序排 
}
int main()
{
	//对于图进行存储 
    int n,m;
    cin>>n>>m;
    for(int i = 0;i < n;i ++ )
    {
		for(int j = 0;j < m;j ++ )
		{
			cin>>g[i][j];
		}
	}
	//遍历图 
	for(int i = 0;i < n;i ++ )
	{
		for(int j = 0;j < m;j ++ )
		{
			//我们所要查找的是图中某个元素的右、下,右下元素块是否符合规则 
			if(g[i][j]=='1'&&g[i+1][j]=='1'&&g[i][j+1]=='1'&&g[i+1][j+1]=='0')
			{
				//若符合规则则查其右面的四个元素是否符合 
				if(g[i][j+7]=='1'&&g[i][j+6]=='1'&&g[i+1][j+7]=='1'&&g[i+1][j+6]=='0')
				{
					//若符合规则则查其下面的四个元素是否符合规则 
					if(g[i+7][j]=='1'&&g[i+7][j+1]=='1'&&g[i+6][j]=='1'&&g[i+6][j+1]=='0')
					{
						//若符合规则则查其右下的四个元素是否符合规则 
						if(g[i+7][j+7]=='1'&&g[i+7][j+6]=='1'&&g[i+6][j+7]=='1'&&g[i+6][j+6]=='0')
						{
							//存储解 
							A.push_back({i,j});
						}
					}
				}
			}
		}
	}
	//对于解进行排序 
	sort(A.begin(),A.end(),cmp);
	for(int i = 0;i < A.size();i ++ )
	{
        if(i==0)cout<<A[i].x<<' '<<A[i].y;
        else cout<<endl<<A[i].x<<' '<<A[i].y;
	}
	//注意最后一组解之后无回车 
    return 0;
}

 3 辛苦的楼长

疫情防控期间,要尽最大努力的保障同学们饮食!楼长们正在统计订饭的人数,一共是三个园区的统计表放在了一个文档里,有一些粗心的同学没有分清园区,错误的将自己的信息填到了其他园区的统计表上。身为帮助楼长的热心同学,你需要写一个程序将所有同学分到正确的园区并统计各个园区需要准备的早饭、午饭、晚饭的份数。

输入格式:

三组数据,每一组代表错误的园区的统计表。

每一组数据第一行是这个统计表上的信息数目n。
该组数据第2行到第n+1行是具体的信息,分别是:宿舍楼(格式为“园区(拼音,松:song,菊:jv,柳:liu)+楼号(数字)”中间无空格,例如“jv4”就表示菊园四号楼),宿舍号,早饭订饭数量,午饭订饭数量,晚饭订饭数量(某个寝室的信息只提交一次,不会重复)。

输出格式:

三组数据,分别代表三个园区的数据状况,按照“松-菊-柳”的顺序输出。

每组数据第一行有四个数,分别是该园区实际订餐的寝室数目,该园区总共订的早餐数目,午餐数目,晚餐数目。

然后输出该园区的所有正确的订单信息,排序输出(保证楼号非递减输出,若是楼号相同的订单则按找寝室号递增输出)。

输入样例:

在这里给出一组输入。例如:

4
song6 321 1 2 1
jv4 422 6 6 6
liu2 211 4 5 3
jv1 331 1 5 4
1
song2 333 6 6 6
1
jv6 612 2 3 3

输出样例:

2 7 8 7
song2 333 6 6 6
song6 321 1 2 1
3 9 14 13
jv1 331 1 5 4
jv4 422 6 6 6
jv6 612 2 3 3
1 4 5 3
liu2 211 4 5 3

数据范围

楼号保证在范围[0-9],房号范围为(100~999),订餐数目总数小于1000,每个园区订餐信息不超过20条。

源代码

纯纯暴力朴素无华 

#include <iostream>
#include <vector>//动态数组用于创建动态结构体数组 
#include <algorithm>//排序 
#include <string.h>//查找字符子串 
using namespace std;
struct PLACE
{
	string name;//宿舍楼名 
	int num;//寝室号 
	int bre;//早餐 
	int lun;//中餐 
	int din;//晚餐 
};
vector<PLACE> A;//存松 
vector<PLACE> B;//存柳 
vector<PLACE> C;//存菊 
int cmp(struct PLACE &X,struct PLACE &Y)//自定义重置sort排序函数 
{
	if(X.name!=Y.name)return X.name<Y.name;//首先按照园区楼号递增 
	else if(X.num!=Y.num)return X.num<Y.num;//其次按照寝室号递增 
}
int sum1bre=0,sum1lun=0,sum1din=0;//松早中晚餐总数 
int sum2bre=0,sum2lun=0,sum2din=0;//柳早中晚餐总数
int sum3bre=0,sum3lun=0,sum3din=0;//菊早中晚餐总数 
int main()
{
	int n;
	//第一次 
	cin>>n;
	while(n--)
	{
		string name;
		int num;
		int bre;
		int lun;
		int din;
		cin>>name>>num>>bre>>lun>>din;
		if(name.find("song")!=-1)//若属于松 
		{
			A.push_back({name,num,bre,lun,din});//存入 
			//早中晚餐累加求和 
			sum1bre+=bre;
			sum1lun+=lun;
			sum1din+=din;
		}
		else if(name.find("jv")!=-1)//若属于柳 
		{
			B.push_back({name,num,bre,lun,din}); 
			//早中晚餐累加求和
			sum2bre+=bre;
			sum2lun+=lun;
			sum2din+=din;
		}
		else if(name.find("liu")!=-1)//若属于菊 
		{
			C.push_back({name,num,bre,lun,din});
			//早中晚餐累加求和
			sum3bre+=bre;
			sum3lun+=lun;
			sum3din+=din;
		}
	}
	cin>>n;
	while(n--)
	{
		string name;
		int num;
		int bre;
		int lun;
		int din;
		cin>>name>>num>>bre>>lun>>din;
		if(name.find("song")!=-1)
		{
			A.push_back({name,num,bre,lun,din});//若属于松  
			//早中晚餐累加求和
			sum1bre+=bre;
			sum1lun+=lun;
			sum1din+=din;
		}
		else if(name.find("jv")!=-1)
		{
			B.push_back({name,num,bre,lun,din});//若属于柳 
			//早中晚餐累加求和
			sum2bre+=bre;
			sum2lun+=lun;
			sum2din+=din;
		}
		else if(name.find("liu")!=-1)
		{
			C.push_back({name,num,bre,lun,din});//若属于菊
			//早中晚餐累加求和
			sum3bre+=bre;
			sum3lun+=lun;
			sum3din+=din;
		}
	}
	cin>>n;
	while(n--)
	{
		string name;
		int num;
		int bre;
		int lun;
		int din;
		cin>>name>>num>>bre>>lun>>din;
		if(name.find("song")!=-1)
		{
			A.push_back({name,num,bre,lun,din});//若属于松  
			//早中晚餐累加求和
			sum1bre+=bre;
			sum1lun+=lun;
			sum1din+=din;
		}
		else if(name.find("jv")!=-1)
		{
			B.push_back({name,num,bre,lun,din});//若属于柳 
			//早中晚餐累加求和
			sum2bre+=bre;
			sum2lun+=lun;
			sum2din+=din;
		}
		else if(name.find("liu")!=-1)
		{
			C.push_back({name,num,bre,lun,din});//若属于菊
			//早中晚餐累加求和
			sum3bre+=bre;
			sum3lun+=lun;
			sum3din+=din;
		}
	}
	//首先输出松的解的个数和早中晚餐总份数 
	cout<<A.size()<<' '<<sum1bre<<' '<<sum1lun<<' '<<sum1din<<endl;
	//对于其中数据排序 
	sort(A.begin(),A.end(),cmp);
	for(int i = 0;i < A.size();i ++ )
	{
		if(i==0)cout<<A[i].name<<' '<<A[i].num<<' '<<A[i].bre<<' '<<A[i].lun<<' '<<A[i].din;
		else if(i==A.size()-1)cout<<endl<<A[i].name<<' '<<A[i].num<<' '<<A[i].bre<<' '<<A[i].lun<<' '<<A[i].din<<endl;
		else cout<<endl<<A[i].name<<' '<<A[i].num<<' '<<A[i].bre<<' '<<A[i].lun<<' '<<A[i].din;
	}
	//首先输出柳的解的个数和早中晚餐总份数 
	cout<<B.size()<<' '<<sum2bre<<' '<<sum2lun<<' '<<sum2din<<endl;
	//对于其中数据排序 
	sort(B.begin(),B.end(),cmp);
	for(int i = 0;i < B.size();i ++ )
	{
		if(i==0)cout<<B[i].name<<' '<<B[i].num<<' '<<B[i].bre<<' '<<B[i].lun<<' '<<B[i].din;
		else if(i==B.size()-1)cout<<endl<<B[i].name<<' '<<B[i].num<<' '<<B[i].bre<<' '<<B[i].lun<<' '<<B[i].din<<endl;
		else cout<<endl<<B[i].name<<' '<<B[i].num<<' '<<B[i].bre<<' '<<B[i].lun<<' '<<B[i].din;
	}
	//首先输出菊的解的个数和早中晚餐总份数 
	cout<<C.size()<<' '<<sum3bre<<' '<<sum3lun<<' '<<sum3din<<endl;
	//对于其中数据排序 
	sort(C.begin(),C.end(),cmp);
	for(int i = 0;i < C.size();i ++ )
	{
		if(i==0)cout<<C[i].name<<' '<<C[i].num<<' '<<C[i].bre<<' '<<C[i].lun<<' '<<C[i].din;
		else if(i==C.size()-1)cout<<endl<<C[i].name<<' '<<C[i].num<<' '<<C[i].bre<<' '<<C[i].lun<<' '<<C[i].din;
		else cout<<endl<<C[i].name<<' '<<C[i].num<<' '<<C[i].bre<<' '<<C[i].lun<<' '<<C[i].din;
	}
	//注意对于输出格式进行调整	
	return 0;
}

 4 等待做核酸

最近新一轮新冠疫情来势汹汹,形势极为严峻,为了保障全体师生的安全,在校师生需要每天做核酸。每天医护人员到达的时间都是不固定的,为了简化问题,假设医护人员到达的时间是整分钟(如10:05:00),并且知道医护人员到达时间的区间,医护人员在这个区间的任意时刻到达的概率相同,核酸检测结束的时间为23:59。在校学生妙酱每天都会按时做核酸,并且妙酱出来做核酸的时间也为整分钟,妙酱想知道自己等多久可以做核酸。由于开始做核酸的时间是不固定的,请你求出妙酱做核酸等待时间(分钟)的期望,忽略妙酱排队等待的时间。

输入格式:

第一行医护人员到达时间的区间(hh:mm-hh:mm)。

第二行cc出来做核酸的时间(hh:mm)。

输入的时间均在一天内。

输出格式:

等待时间(分钟)的期望值,保留两位小数。

输入样例:

10:00-10:29
10:15

输出样例:

3.50

源代码 

这道题太老六了我真的是糊了 

#include <iostream>
using namespace std;
int main()
{
	//利用格式化读入快速得到数据 
	int h1,m1,h2,m2;
	scanf("%2d:%2d-%2d:%2d",&h1,&m1,&h2,&m2);
	int h3,m3;
	scanf("%2d:%2d",&h3,&m3);
	//化为分钟对数据进行处理 
	int st=h1*60+m1;//医生开始 
	int ed=h2*60+m2;//医生走 
	int t=h3*60+m3;//cc到的时间 
	double ans=0;//初始化 
	//总概率为1分为(ed-st+1)份 
	for(int i = 1;i <= ed-t;i ++ )
	{
		//从cc到开始直至医生走累加求和 
		ans+=i*1.0/(ed-st+1);
	}
	printf("%.2lf",ans);
	return 0;
}
  • 11
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

计科土狗

谢谢家人们

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值