宁波工程学院校赛解题报告

宁波校赛解题报告(by 「D.Ten)

//OJ:http://acm.nbut.cn/
//NBUT2012校赛I(東方Project專題) 网络同步赛 (共9题  目前AC8题)
PS: 剩1题 
	H题(1121):几何(没学)


//A [1114] Alice's Puppets
//邻接矩阵 125MS
#include<iostream>
#include<string>
#include<queue>
using namespace std;

#define N 2005
#define M 25

int n,cnt;
int map[N][N],visit[N];
queue<int>Q;

struct node{
	char name[M];
	int num;
}arr[N];

int add(char x[]){
	int i;
	for(i = 1; i <= cnt; ++i)
		if(!strcmp(arr[i].name,x))
			return i;
	strcpy(arr[++cnt].name,x);
	return cnt;
}


int cmp(const void *a,const void *b){
	if((*(node *)a).num != (*(node *)b).num)
		return (*(node *)a).num - (*(node *)b).num;
	return strcmp((*(node *)a).name,(*(node *)b).name);
}
int main(){
	int i;
	int a,b;
	char c1[M],c2[M];
	while(scanf("%d",&n)!=EOF){
		cnt = 0;
		memset(map,0,sizeof(map));
		memset(visit,0,sizeof(visit));
		for(i = 1; i <= n; ++i){
			scanf("%s %s",c1,c2);
			a = add(c1);
			b = add(c2);
			map[b][a] = 1;
		}
		int s = add("Alice");
		Q.push(s);
		arr[s].num = 0;

		while(!Q.empty()){
			int p =Q.front();
			Q.pop();
			visit[p] = 1;
			for(i = 1; i <= cnt; ++i)
				if(map[p][i] && !visit[i]){
					arr[i].num = arr[p].num + 1;
					visit[i]  = 1;
					Q.push(i);
				}
		}
		qsort(arr+1,cnt,sizeof(arr[0]),cmp);
		for(i = 2; i <= cnt; ++i)
			printf("%s %d\n",arr[i].name,arr[i].num);
	}
	return 0;
}


//A [1114] Alice's Puppets
//邻接表 31MS
#include<iostream>
#include<string>
#include<queue>
using namespace std;

#define N 2005
#define M 25

int n,cnt;
int visit[N];
int head[N],num;
queue<int>Q;

struct node{
	char name[M];
	int num;
}arr[N];

struct Edge{
	int from;
	int to;
	int next;
}edge[N*N];

void addedge(int from, int to){
	edge[num].from = from;
	edge[num].to = to;
	edge[num].next = head[from];
	head[from] = num++;
}

int add(char x[]){
	int i;
	for(i = 1; i <= cnt; ++i)
		if(!strcmp(arr[i].name,x))
			return i;
	strcpy(arr[++cnt].name,x);
	return cnt;
}

int cmp(const void *a,const void *b){
	if((*(node *)a).num != (*(node *)b).num)
		return (*(node *)a).num - (*(node *)b).num;
	return strcmp((*(node *)a).name,(*(node *)b).name);
}

int main(){
	int i;
	int a,b;
	int q,u;
	char c1[M],c2[M];
	while(scanf("%d",&n)!=EOF){
		cnt = num =0;
		memset(visit,0,sizeof(visit));
		memset(head,-1,sizeof(head));
		for(i = 1; i <= n; ++i){
			scanf("%s %s",c1,c2);
			a = add(c1);
			b = add(c2);
			addedge(b,a);
		}
		int s = add("Alice");
		Q.push(s);
		arr[s].num = 0;

		while(!Q.empty()){
			int p =Q.front();
			Q.pop();
			visit[p] = 1;
			for(q = head[p]; q!=-1; q= edge[q].next){
				u = edge[q].to;
				if(!visit[u]){
					arr[u].num = arr[p].num + 1;
					visit[u]  = 1;
					Q.push(u);
				}
			}
		}
		qsort(arr+1,cnt,sizeof(arr[0]),cmp);
		for(i = 2; i <= cnt; ++i)
			printf("%s %d\n",arr[i].name,arr[i].num);
	}
	return 0;
}

//B [1115] Cirno's Trick
#include<iostream>
#include<stdlib.h>
using namespace std;

#define N 10

double arr[N];

int cmp( const void *a , const void *b ){
	return *(double *)a > *(double *)b ? 1 : -1;
}
int main(){
	int i,n;
	while(scanf("%d",&n)!=EOF){

		for(i = 0; i < n ; ++i )
			scanf("%lf",&arr[i]);
		qsort(arr,n,sizeof(arr[0]),cmp);
		double ans = 0;
		for(i = 1 ; i < n-1; ++ i)
			ans += arr[i];
		printf("%.2lf\n",ans/(n-2));
	}
	return 0;
}

//C [1116] Flandre's Passageway 【DP  最长上升子序列】
#include<iostream>
#include<cmath>
#include<stdlib.h>
#include <algorithm>
using namespace std;

#define N 2005

int n,m,k;
struct node{
	int x;
	int y;
}arr[N];

int cmp(node a,node b) {
	return a.x < b.x;
}

int dp[N];
int LIS(int n)
{
	int i,j;
	for(i=1; i<=n; ++i)
		dp[i] = 0;
	int ans;
	dp[1] = 1;
	for(i=2; i<=n; ++i)
	{
		ans = dp[i];
		for(j=1; j<i; ++j)
		{
			if(arr[i].x>arr[j].x && arr[i].y>arr[j].y && dp[j]>ans)
				ans = dp[j];
		}
		dp[i] = ans+1;
	}
	ans = 0;
	for(i=1; i<=n; ++i)
	{
		if(dp[i] > ans)
			ans = dp[i];
	}
	return ans;
}

int main(){
	int i,j;
	while(scanf("%d %d %d",&n,&m,&k)!=EOF){
		for(i =1; i <= k; ++i)
			scanf("%d %d",&arr[i].x,&arr[i].y);
		sort(arr+1,arr+1+k,cmp);	
		int max = LIS(k);
		double bx = (n+m-2*max)*100+sqrt(2.0)*100*max;
		printf("%d\n",(int)(bx+0.5));
	}
	return 0;
}

/*
4 5
5
1 1
3 2
2 2
5 2
6 3

max = 3
*/

//D [1117] Kotiya's Incantation
/*
check: '-'作为结束符 回车则是下一个数据的第一个
GM的提示:a-a-\na-a- 那么第一组数据是SAME而第二组是SIMILAR,至于为什么,想想回车就知道

啦
*/
#include<iostream>
using namespace std;

#define Min(a,b) ((a<b)?(a):(b))
#define Max(a,b) ((a>b)?(a):(b))
#define N 10000
char a[N],b[N];
int cnt1,cnt2;

char c;
int main(){
	int i,j;
	int flag;
	cnt1 = cnt2 = -1;
	flag = 0;
	while(scanf("%c",&c)!=EOF){
		while(c!='-'){
			a[++cnt1] = c;
			scanf("%c",&c);
		}
		a[cnt1+1] = '\0';

		scanf("%c",&c);
		while(c!='-'){
			b[++cnt2] = c;
			scanf("%c",&c);
		}
		b[cnt2+1] = '\0';
		
		if(!strcmp(a,b))
			printf("SAME\n");
		else{
			for(i = 0,j = -1; i <= cnt1; ++i)
				if(('a' <= a[i] && a[i] <= 'z')||('A' <= a[i] && a[i] <= 

'Z'))
					a[++j] = a[i];
			cnt1 = j;
			a[cnt1+1] = '\0';

			for(i  = 0 ,j = -1; i <= cnt2 ; ++i)
				if(('a' <= b[i] && b[i] <= 'z')||('A' <= b[i] && b[i] <= 

'Z'))
					b[++j] = b[i];
			cnt2 = j;
			b[cnt2+1] = '\0';
			if(!strcmp(a,b))
				printf("SIMILAR\n");
			else
				printf("DIFFERENT\n");
		}
		c = getchar();
		cnt1 = cnt2 = -1;
		if(c == -1)
			flag = 1;
		else {
			if(c!='-')
			a[++cnt1] = c;
		}
		if(flag)
			break;
	}
	return 0;
}


//E [1118] Marisa's Affair
#include<iostream>
#include<string>
#include <algorithm>
#include<stdlib.h>
using namespace std;

#define N 5005
#define M 25

struct node{
	char name[M];
	int num;
	int x;
}arr[N];

int n,cnt;

void add(char x[],int y){
	int i;
	for(i = 0; i <= cnt; ++i)
		if(!strcmp(arr[i].name,x)){
			arr[i].num += y;
			arr[i].x++;
			break;
		}
	if(i>cnt){
		strcpy(arr[++cnt].name,x);
		arr[i].num = y;
		arr[i].x = 1;
	}
}

int cmp(const void *a, const void *b){
	if((*(node *)b).num != (*(node *)a).num)
		return (*(node *)b).num - (*(node *)a).num;

	if((*(node *)b).x != (*(node *)a).x)
		return (*(node *)b).x - (*(node *)a).x;

	return strcmp((*(node *)a).name,(*(node *)b).name);
}
int main(){
	char temp[M];
	int num,i,j;	
	while(scanf("%d",&n)!=EOF){
		cnt = 0;
		for(j =1; j <= n; ++j){
			scanf("%s %d",temp,&num);
			add(temp,num);
		}
		qsort(arr+1,cnt,sizeof(arr[0]),cmp);
		printf("%d\n",cnt);
		for(i =1; i <= cnt; ++i)
			printf("%s %d %d\n",arr[i].name,arr[i].num,arr[i].x);
	}

	return 0;
}

//F [1119] Patchouli's Books
/*
解题思路:
全排列 输出时
对每一位加权判重复
越前面的加的权值越大
*/
#include<iostream>
#include<algorithm> 
using namespace std; 

int v[10],num[10],ran[10]; 
long long now,temp;

long long pow(long long x,long long y){
	int i;
	if(y == 0)
		return 1;
	for(i = 1; i <= y; ++i)
		x *= 16;
	return x;
}

void DFS(int deep,int n){	
	int i; 
	if(deep == n){
		int b =0;
		temp = 0;
		for(i = 0; i < n; ++i)
			temp += num[ran[i]]*pow((long long)1,(long long)n-i);
		if(temp > now){
			now = temp;
			for(i = 0 ; i < n; i++) { 
				if(i < n-1)
					printf("%X ",num[ran[i]]);
				else
					printf("%X\n",num[ran[i]]);
			} 
		}
		return ; 
    }  
	for(i = 0;i < n;i++){ 
		if(v[i]==0){ 
			ran[deep] = i; 
			v[i] = 1; 
			DFS(deep+1,n); 
			v[i] = 0; 	
		} 	
	} 
} 
int main(){
	int n,i;
	while(scanf("%d",&n)!=EOF){
		for(i = 0;i < n;i++){
			v[i] = 0; 	
			scanf("%d",&num[i]);
		}
		now = 0;
		sort(num,num+n); 
		DFS(0,n);	
	} 
	return 0; 
	
} 

//G [1120] Reimu's Teleport
//线段树 成段替换 区间求和
/*
解题思路
线段树叶子结点中
0表示top
1表示向右
1000000表示向左
查询的结果ans
向左:ans/1000000
向右:ans%1000000
向上:区间长度减去上面那两个
*/

#include<stdio.h>
#include<string.h>


#define N 100005
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
//#define int64 __int64
#define int64 long long
int m,n;


int64 sum[N<<2];
int64 add[N<<2];


void pushup(int rt){
	sum[rt] = sum[rt<<1] + sum[rt<<1|1];
}


void pushdown(int rt,int m){
	if(add[rt]){
		add[rt<<1] = add[rt];
		add[rt<<1|1] = add[rt];
		sum[rt<<1] = add[rt] * (m-(m>>1));
		sum[rt<<1|1] = add[rt] * (m>>1);
		add[rt] = 0;
	}
}


void update(int rt, int l,int r, int L,int R,int c){
	if(L <= l && R >= r){
		add[rt] = c;
		sum[rt] = (int64)c * (r-l+1);
		return ;
	}
	pushdown(rt,r-l+1);
	int mid = (l + r) >> 1;
	if(L <= mid) update(lson,L,R,c);
	if(R > mid) update(rson,L,R,c);
	pushup(rt);
}


int64 query(int rt,int l,int r, int L,int R){
	if(L <= l && R >= r)
		return sum[rt];
	pushdown(rt,r-l+1);
	int mid = ( r + l) >>1;
	int64 res = 0;
	if(L <= mid) res += query(lson,L,R);
	if(R > mid) res +=  query(rson,L,R);
	return res;
}


void print(int n){
	int i;
	for(i = 0; i <= n; ++i)
		printf("sum[%d]: %I64d\n",i,sum[i]);
	puts("");
}


int main(){
	int i;
	int a,b;
	char op[5];
	while(scanf("%d %d",&m,&n)!=EOF){
		memset(sum,0,sizeof(sum));
		memset(add,0,sizeof(add));
		//print(30);
		for(i = 1; i <= m; ++i){
			scanf("%s %d %d",op,&a,&b);
			if(op[0] == 'F'){
				if(a < b)
					update(1,1,n,a,b,1);
				else
					update(1,1,n,b,a,1000000);
				//print(30);
			}
			else{
				int64 ans = query(1,1,n,a,b);
				int64 l = ans/1000000;
				int64 r = ans%1000000;
				int64 t = b-a+1-l-r;
				//printf("%I64d %I64d %I64d\n",l,t,r);
				printf("%lld %lld %lld\n",l,t,r);
			}
		}
	}
	return 0;
}


//I  [1122] Shameimaru's Candid Camera 【N,M 给的是相反的 输出时 每组数据间要加空行】
#include<iostream>
using namespace std;

#define N 505

char map[N][N];
int ans[N][N];
int dir[8][2]={-1,-1,-1,0,-1,1,0,-1,0,1,1,-1,1,0,1,1};
int n,m;

bool check(int x,int y){
	if(x >= 1 && x <= n && y >= 1 && y <= m)
		return true;
	return false;
}
int main(){
	int i,j,k,ca=1;
	int x,y;
	memset(map,0,sizeof(map));
	memset(ans,0,sizeof(ans));
	while(scanf("%d %d",&m,&n)!=EOF){
		if(ca != 1)
			printf("\n");
		else ca++;
		for(i = 1; i <= n; ++i)
			scanf("%s",map[i]+1);
		
		for(i = 1; i <= n; ++i)
			for(j = 1; j <= m; ++j){
				if(map[i][j] != '*'){
					ans[i][j] = 0;
					for(k = 0; k <8; ++k){
						x = i + dir[k][0];
						y = j + dir[k][1];
						if(check(x,y) && map[x][y] =='*')
							ans[i][j]++;
					}
				}
			}
		for(i = 1; i <= n; ++i){
			for(j = 1; j <= m; ++j){
				if(map[i][j] == '*')
					printf("*");
				else if(ans[i][j] == 0)
					printf("-");
				else
					printf("%d",ans[i][j]);
			}
			printf("\n");
		}
	}
	return 0;
}

采用PyQt5框架与Python编程语言构建图书信息管理平台 本项目基于Python编程环境,结合PyQt5图形界面开发库,设计实现了一套完整的图书信息管理解决方案。该系统主要面向图书馆、书店等机构的日常运营需求,通过模块化设计实现了图书信息的标准化管理流程。 系统架构采用典型的三层设计模式,包含数据存储层、业务逻辑层和用户界面层。数据持久化方案支持SQLite轻量级数据库与MySQL企业级数据库的双重配置选项,通过统一的数据库操作接口实现数据存取隔离。在数据建模方面,设计了包含图书基本信息、读者档案、借阅记录等核心数据实体,各实体间通过主外键约束建立关联关系。 核心功能模块包含六大子系统: 1. 图书编目管理:支持国际标准书号、中国图书馆分类法等专业元数据的规范化著录,提供批量导入与单条录入两种数据采集方式 2. 库存动态监控:实时追踪在架数量、借出状态、预约队列等流通指标,设置库存预警阈值自动提醒补货 3. 读者服务管理:建立完整的读者信用评价体系,记录借阅历史与违规行为,实施差异化借阅权限管理 4. 流通业务处理:涵盖借书登记、归还处理、续借申请、逾期计算等标准业务流程,支持射频识别技术设备集成 5. 统计报表生成:按日/月/年周期自动生成流通统计、热门图书排行、读者活跃度等多维度分析图表 6. 系统维护配置:提供用户权限分级管理、数据备份恢复、操作日志审计等管理功能 在技术实现层面,界面设计遵循Material Design设计规范,采用QSS样式表实现视觉定制化。通过信号槽机制实现前后端数据双向绑定,运用多线程处理技术保障界面响应流畅度。数据验证机制包含前端格式验与后端业务规则双重保障,关键操作均设有二次确认流程。 该系统适用于中小型图书管理场景,通过可扩展的插件架构支持功能模块的灵活组合。开发过程中特别注重代码的可维护性,采用面向对象编程范式实现高内聚低耦合的组件设计,为后续功能迭代奠定技术基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
《基于SSM架构的学籍数据管理平台技术解析》 在当代数字化教育背景下,数据管理平台已成为教育机构运营的核心支撑。本系统以SSM技术组合为基础架构,构建了一套完整的学籍信息处理体系,通过系统化的技术方案实现教育数据的规范化管理与智能分析。以下从架构设计、技术实现与功能模块三个维度展开说明。 一、系统架构设计 该平台采用分层式架构设计,充分体现模块化与可维护性特征。Spring框架作为核心容器,通过依赖注入机制实现组件解耦;SpringMVC架构负责前端请求的路由与响应处理;MyBatis数据层框架则封装了数据库交互过程,通过映射配置简化SQL操作。三层架构协同工作,形成高内聚低耦合的技术体系。 二、技术实现要点 1. Spring容器:基于控制反转原则管理业务对象生命周期,结合面向切面编程实现事务控制与日志管理 2. SpringMVC模块:采用模型-视图-控制器设计范式,规范Web层开发流程,支持RESTful接口设计 3. MyBatis组件:通过XML配置实现对象关系映射,提供动态SQL生成机制,显著减少冗余编码 三、核心功能模块 1. 学籍信息维护:实现学员基本资料的增删改查操作,涵盖学籍编号、个人信息、所属院系等关键字段 2. 学业成绩管理:支持课程分数录入与批量处理,提供多维度统计分析功能 3. 教学组织管理:建立班级体系与学员关联关系,实现分级数据管理 4. 权限控制机制:基于角色访问控制模型,划分管理员、教职工、学员三级操作权限 5. 系统审计功能:完整记录用户操作轨迹,构建安全追踪体系 四、系统开发方法论 在项目生命周期中,采用结构化开发流程。前期通过需求调研确定系统边界,中期完成数据库范式设计与接口规范制定,后期采用迭代开发模式配合自动化测试,确保系统交付质量。 五、技术演进展望 当前系统虽未集成智能算法,但为未来升级预留了扩展接口。可预见的技术演进方向包括:基于学习行为数据的智能预警、个性化学习路径推荐等深度应用场景。 综上所述,该平台通过SSM技术体系实现了教育管理数据的标准化处理,既展示了现代软件开发范式的实践价值,也为教育信息化建设提供了可复用的技术方案。这种系统化的问题解决思路,充分体现了软件工程方法在教育领域的应用潜力。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值