北华大学第九届程序设计竞赛 题解

news/2024/7/15 17:23:25 标签: 算法, 图论, c++, 算法竞赛, 学习

5.14和队友VP一场,第二次VP,状态明显比第一次好很多,总共A了7题,基本是能做出来的都做出来了,最后还剩下接近2小时的时间。。。。。

A "北华"有几何

思路:数图片中“北华”的数量,直接输出即可

B 学霸题 II

思路:二分+前缀和(缺少任何一个都会超时)

首先输入数组a(正视图每列的个数)然后对其进行排序,计算数组a的前缀和,再输入数组b(侧视图每列的个数),数组b每个数只能小于或者等于数组a的每一个数。这样想,假如开始按正视图的个数堆满,那么考虑每列侧视图时,正式图只要大于当前列侧视图的都要削减到和当前列侧视图同高,所以每输入一个b,二分数组a,在数组a中查找第一个大于b的数,前半部分不变,直接是前缀和即可,后半部分都等于当前列侧视图b

lower_bound(begin,end,num);                        查找第一个大于等于num的数字upper_bound(begin,end,num);                       查找第一个大于num的数字

AC代码: 

#include<iostream>
#include<algorithm>
#define int long long
using namespace std;

const int N=300005;
int a[N],b[N],sum[N];
signed main(){
	int n,m,ans=0,pos;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++){
		sum[i]=sum[i-1]+a[i];
	}
	cin>>m;
	for(int i=1;i<=m;i++){
		cin>>b[i];
		pos=upper_bound(a+1,a+n+1,b[i])-a;
		ans+=(n-pos+1)*b[i]+sum[pos-1];
	}
	cout<<ans;
	return 0;
}

C 小杜的字符串

思路:模拟

对字符串的每列进行遍历,将每列的字符都变成在每列中出现次数最多的字符,因为只有三行,所以记录字符出现次数,每次答案加上3-最大字符数即可

AC代码:

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

string s[5];
int sum[30];
int main(){
	int n,ans=0;
	cin>>n;
	for(int i=1;i<=3;i++){
		cin>>s[i];
	}
	for(int i=0;i<n;i++){
		memset(sum,0,sizeof(sum));
		for(int j=1;j<=3;j++){
			sum[s[j][i]-'a']++;
		}	
		sort(sum,sum+26);
		ans+=3-sum[25];
	}
	cout<<ans;
	return 0;
}

D 矿石精炼场

思路:模拟题

因为只能购买一台矿石精炼器,所以分析两种情况取最大值即可。第一种情况,不购买矿石精炼器,最后的金钱即为当前手里的金钱+矿资源的价值。第二种情况,购买矿石精炼器,若要购买矿石精炼器,首先电力资源要满足,所以要修建发电站,要修建发电站,首先要看钱满不满足,所以要先判断电力资源满不满足,计算需要修建发电机需要的钱数(注意不能出现负的),矿产资源数和当前手里的钱数减去需要的钱数,剩下的再通过矿石精炼

AC代码:

#include<iostream>
#include<cmath>
using namespace std;

int main(){
	double T,w,m,E,D,c0,d,p,c1,e,sum1,sum2,nm;
	cin>>T;
	while(T--){
		cin>>w>>m>>E>>D>>c0>>d>>p>>c1>>e;
		sum1=w+m;
		nm=max(0.0,ceil((D+d-E)/e))*c1+c0;
		if(nm<=m){
			sum2=w*(1+p*0.01)+m-nm;
		}else{
			sum2=(w+m-nm)*(1+p*0.01);
		}
		printf("%.2lf\n",max(sum1,sum2));
	}
	return 0;
}

E 天空岛

优先队列的自定义不会写!!!!!仿函数啥的啊啊啊啊!!!带结构体的优先队列。。。

开始只考虑BFS,未考虑优先队列,所以总是想不出来这样写为什么会AC,之后才慢慢理解。。

思路:BFS+优先队列

先将第一个点加入队列,然后只要队列非空,取出一个点(因为是优先队列,所以取出的点为当前队列中w,即承重极限最大的),注意货物必须首先满足重量小于等于该单元格的承重极限,所以每次结果为队列中承重极限最大的,同时单独计算精灵分担的货物重量

AC代码:

#include<iostream>
#include<queue> 
#define int long long
using namespace std;

const int N=1005;
int w[N][N],val[N][N];
bool vis[N][N];
int dx[]{-1,1,0,0};
int dy[]{0,0,-1,1};
struct Node{
	int x;
	int y;
	int z;
};

struct cmp{
	bool operator()(Node a,Node b){
		return a.z<b.z;
	}
};

signed main(){
	int n,m,k,x,y,v,ans=0x3f3f3f3f,sum=0;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>w[i][j];
		}
	}
	cin>>k;
	for(int i=1;i<=k;i++){
		cin>>x>>y>>v;
		val[x][y]=v;
	}
	priority_queue<Node,vector<Node>,cmp> q;
	q.push({1,1,w[1][1]});
	while(!q.empty()){
		Node t=q.top();
		int a=t.x,b=t.y,c=t.z;
		q.pop();
		//防止队列中出现多次同一个元素!!!
		//某个在队列中间的元素被多次压入!! 
		if(vis[a][b]){
			continue;
		}
		vis[a][b]=1;
		ans=min(ans,c+sum);
		sum+=val[a][b];
		if(a==n&&b==m){
			break;
		}
		for(int i=0;i<4;i++){
			int nx=a+dx[i],ny=b+dy[i];
			if(vis[nx][ny]||nx<1||nx>n||ny<1||ny>m){
				continue;
			}
			q.push({nx,ny,w[nx][ny]});
		}
	}
	cout<<ans;
	return 0;
}

F Karashi的树 II 

思路:并查集+最短路

不会。。。。

G 114514国

思路:思维题,因为给一张45找回四张11相当于支付1,注意要求:0≤A,B,C,a,b,c≤10^{9}所以先支付45面值的,取余45即可,剩下的再使用一张45找回四张

AC代码:

#include<iostream>
using namespace std;

int main(){
	long long n,ans=0;
	cin>>n;
	ans+=n/45;
	n%=45;
	cout<<0<<' '<<ans+n<<' '<<0<<'\n';
	cout<<n*4<<' '<<0<<' '<<0<<'\n';
	return 0;
}

H 杰哥的激光炮

思路:也算是思维题吧。。。先求长和宽的最大公约数,答案即为:最大公约数*(长/最大公约数+宽/最大公约数-1)

AC代码:

#include<iostream>
#include<algorithm>
using namespace std;

int main(){
	int T,x,y;
	cin>>T;
	while(T--){
		cin>>x>>y;
		if(x==y){
			cout<<x<<'\n';
		}else{
			int t=__gcd(x,y);
			cout<<t*(x/t+y/t-1)<<'\n';
		}
	}
	return 0;
}

I TAROT I 

思路:容斥

不会。。。

L Karashi的电灯泡 

思路:大模拟。。。理解不了。。。。。

M 超时空传送!!偷袭

思路:水题。。。输出九个战斗力最大的和即可(不足九个输出和)

#include<iostream>
#include<algorithm>
using namespace std;

const int N=105;
int a[N];

bool cmp(int x,int y){
	return y<=x;
}
int main(){
	int n,ans=0;
	cin>>n;
	string s;
	for(int i=0;i<n;i++){
		cin>>s>>a[i];
	}
	sort(a,a+n,cmp);
	for(int i=0;i<9;i++){
		ans+=a[i];
	}
	cout<<ans;
}


http://www.niftyadmin.cn/n/333858.html

相关文章

springcloud基于web的智慧养老平台

系统分析 可行性分析 在开发系统之前要进行系统可行性分析&#xff0c;目的是在用最简单的方法去解决最大的问题&#xff0c;程序一旦开发出来满足了用户的需要&#xff0c;所带来的利益也很多。下面我们将从技术、操作、经济等方面来选择这个系统最终是否开发。 1、技术可行…

Qt 获取程序所在路径等特殊路径

经常我们的程序中需要访问一些特殊的路径&#xff0c;比如程序所在的路径、用户目录路径、临时文件夹等。在 Qt 中实现这几个功能所用的方法虽然都不难&#xff0c;但是各不相同&#xff0c;每次用到时还要现去查&#xff0c;很不方便。因此就写了这篇博客&#xff0c;把这几种…

[元带你学: eMMC完全解读 3] eMMC 家族傻傻分不清

声明 主页:元存储的博客_CSDN博客 依公开知识及经验整理,如有误请留言。 个人辛苦整理,付费内容,禁止转载。 所在专栏 《元带你学: eMMC完全解读》 内容摘要 全文4000字, 主要有 目录 1.1 MMC 1.2 eMMC 1.3 eMCP 1.4 M

HTTP(五)-- Request共享数据(与Request转发联合使用)

目录 1. request域的定义: 2. Request共享数据的常用方法: 1. request域的定义: 代表一次请求的范围,一般用于

使用Spring Boot和Spring Cloud实现多租户架构:支持应用多租户部署和管理

使用Spring Boot和Spring Cloud实现多租户架构&#xff1a;支持应用多租户部署和管理 一、概述1 什么是多租户架构&#xff1f;2 多租户架构的优势3 实现多租户架构的技术选择 二、设计思路1 架构选型1.1 Spring Boot1.2 Spring Cloud 2 数据库设计3 应用多租户部署3.1 应用隔离…

SolidWorks二次开发(C#)-环境搭建

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1、前言2、按照Solidworks2022和VS20223、在VS2022中创建一个Winform工程4、添加SolidWorks动态链接库5、在按钮中添加代码6、测试 1、前言 做了有些SolidWorks二次…

C++/C/PTA 抢红包

抢红包 题目要求解题思路代码头文件memset函数 总结 题目要求 没有人没抢过红包吧…… 这里给出N个人之间互相发红包、抢红包的记录&#xff0c;请你统计一下他们抢红包的收获。 输入格式&#xff1a; 输入第一行给出一个正整数N&#xff08;≤104&#xff09;&#xff0c;即…

基于matlab的ADC输入动态范围测量代码

如图&#xff0c;本文主要分享基于matlab的ADC输入数据有效位分析的代码。 fidfopen(C:\Users\Administrator\Desktop\Test.txt,r); % numptinput(Data Record Size (Number of Points)? );% fclkinput(Sampling Frequency (MHz)? ); numpt16384; fclk50; numbit14; [v1]fs…