IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 第十一届山东省大学生程序设计竞赛 -> 正文阅读

[C++知识库]第十一届山东省大学生程序设计竞赛

第十一届山东省大学生程序设计竞赛

B. Build Roads

题意:给定一个长度为n的序列,构建一个无向图,无相图边长为 g c d ( a [ i ] , a [ j ] ) gcd(a[i],a[j]) gcd(a[i],a[j]),为从区间 [L,R]中的随机数。但是n最大为2e5,L和R为2e5,不能直接考虑最小生成树算法,需找规律,当 L = = R L==R L==R时,所有的 g c d ( a [ i ] , a [ j ] ) gcd(a[i],a[j]) gcd(a[i],a[j])全部为L,所以图的总长度为 L ? ( n ? 1 ) L*(n-1) L?(n?1)。还有一条件,若这n个数中出现 质数,则所有点和他的gcd都为1,所以结果就为 n ? 1 n-1 n?1,int范围内,相邻质数的距离不超过1000,所以当 ( n > 1000 & & L ! = R ) (n>1000\&\& L!=R) (n>1000&&L!=R)时,结果就为n-1。当n<1000时,直接kruskal最小生成树即可。

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int n,L,R,a[200001];
unsigned long long seed;
unsigned long long xorshift64() {
	unsigned long long x=seed;
	x^=x<<13;
	x^=x>>7;
	x^=x<<17;
	return seed=x;
}
class node{
	public:
		int i,j;
		int wast;
};
bool operator<(const node &a,const node &b){
	return a.wast<b.wast;
}
int gen() {
	return xorshift64()%(R-L+1)+L;
}
const int mx=2e5+5;
int fa[mx];
vector<node>ve;
int find(int x){
	if(fa[x]!=x){
		fa[x]=find(fa[x]);
	}
	return fa[x];
}
void Krusal() {
	for(int i=0; i<mx; i++) {
		fa[i]=i;
	}
	sort(ve.begin(),ve.end());
	int o=0;
	long long sum=0;
	for(int i=0;i<ve.size()&&o<n-1;i++){
		node no=ve[i];
		int t1=find(no.i);
		int t2=find(no.j);
		if(t1!=t2){
			fa[t1]=t2;
			o++;
			sum+=no.wast;
		}
	}
	cout<<sum<<endl;
}
int main() {
	scanf("%d%d%d%llu",&n,&L,&R,&seed);
	if(L==R) {
		cout<<1ll*L*(n-1);
	} else if(n>1000) {
		cout<<n-1;
	} else {
		for(int i=1; i<=n; i++) {
			a[i]=gen();
		}
		for(int i=1; i<=n; i++) {
			for(int j=i+1; j<=n; j++) {
				node no;
				no.i=i;
				no.j=j;
				no.wast=__gcd(a[i],a[j]);
				ve.push_back(no);
			}
		}
		Krusal();
	}
}

C.Cat Virus

题意:建立一棵树,树上的结点分黑白,黑节点的所有子节点全为黑,白结点的子节点可为黑可为白。建树,数的情况恰好有k种

考点:思维+构造

题解:总结规律可得,某节点原来没有子节点,加一个子节点,总可能数=原数量+1,若已有子节点,则加一个子节点,总可能数=1+原来子节点的总数*2。所以,当k可以被2整除时,只需在当前节点下加新的结点即可,若不可以,则需要格外加一个子节点,然后在该子节点下继续加新的节点。

注意:数据范围需要long long

#include <iostream>
#include <vector>
using namespace std;
typedef long long int ll;
vector<ll> a[1005];
ll n=1;
void to(ll i,ll k){
	a[0].push_back(i);
	ll tmp=k-1;
	while(tmp%2==0){
		a[i].push_back(++n);
		tmp/=2;
	}
	if(tmp==1)return;
	a[i].push_back(++n);
	to(n,tmp);
}
int main(){
	ll k;
	cin>>k;
	to(1,k);
	cout<<n<<endl;
	for(ll i=0;i<a[0].size();i++){
		ll t=a[0][i];
		for(ll j=0;j<a[t].size();j++){
			printf("%lld %lld\n",t,a[t][j]);
		}
	}
} 

G. Grade Point Average

题意:给n个数,让求这n个数的平均数,保留k位小数。

题解:模拟除法即可

#include <iostream>
using namespace std;
typedef long long int ll;
int main(){
	int n,k;
	cin>>n>>k;
	ll sum=0;
	for(int i=0;i<n;i++){
		int t;
		scanf("%d",&t);
		sum+=t;
	}
	ll t=sum/n;
	sum%=n;
	cout<<t<<".";
	for(int i=0;i<k;i++){
		sum*=10;
		cout<<sum/n;
		sum%=n;
	}
}

H.Adventurer’s Guild

题意:给定一个血量,耐力,打怪,怪有血量,有耐力,有赏金,耐力没了可以用血凑,血没了就死了,求活着的前提下获得的最大赏金。

题解:背包+范围考虑

注意:数据范围

#include <iostream>
#include <cstring>
using namespace std;
int n,h,s;
class last {
	public:
		long long int b[305][305];
		last() {
			memset(b,0,sizeof(b));
		}
};
last l1,l2;
class node {
	public:
		int h,s,w;
};
node no[1005];
int main() {
	cin>>n>>h>>s;
	for(int i=0; i<n; i++) {
		scanf("%d%d%d",&no[i].h,&no[i].s,&no[i].w);
	}
	for(int i=0; i<n; i++) {
		for(int j=1; j<=h; j++) {
			for(int w=0; w<=s; w++) {
				l2.b[j][w]=l1.b[j][w];
				long long int tmp=0;
				if(j+w>no[i].h+no[i].s&&j>no[i].h) {
					tmp+=no[i].w;
					if(w>=no[i].s) {
						tmp+=l1.b[j-no[i].h][w-no[i].s];
					} else {
						int t=j-no[i].h-(no[i].s-w);
						tmp+=l1.b[t][0];
					}
				}
				l2.b[j][w]=max(l2.b[j][w],tmp);
			}
		}
		l1=l2;
		last l;
		l2=l;
	}
	cout<<l1.b[h][s]<<endl;
}

M.Matrix Problem

题意:给一个01矩阵C,说该矩阵是由AB矩阵同为1的点,C矩阵中才为1,否则为0,让你求,AB矩阵,并且要求,AB矩阵要将C矩阵中的1连接起来。注意:题目给出了,矩阵的最外围全为0。

考点:思维+构造

题解:C中为1的点,AB都必为1,可以将奇数行都给A变为1,偶数行都给B变为1,并且最左侧一列给A全为1,最右侧一列全给B全为1,即可。

#include <iostream>
#include <cstring>
using namespace std;
const int mx=505;
int a[mx][mx];
bool ff[mx][mx];
int main(){
	int n,m;
	cin>>n>>m;
	bool f[mx];
	memset(ff,0,sizeof(ff));
	memset(a,0,sizeof(a));
	memset(f,0,sizeof(f));
	getchar();
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			char ch=getchar();
			a[i][j]=ch-'0';
			if(a[i][j]&&i&1==0){
				f[i]=1;
			}
		} 
		getchar();
	}
	for(int i=0;i<n;i++){
		for(int j=0;j<m-1;j++){
			if(i&1||j==0){
				printf("1");
			}else{
				printf("%d",a[i][j]);
			}
		}
		printf("0");
		cout<<'\n';
	}
	for(int i=0;i<n;i++){
		printf("0");
		for(int j=1;j<m;j++){
			if(i%2==0||j==m-1){
				printf("1");
			}else{
				printf("%d",a[i][j]);
			}
		}
		cout<<'\n';
	}
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-21 18:44:48  更:2022-05-21 18:47:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/13 20:17:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码