福州大学第十届程序设计竞赛 -- 部分题解

题目传送:福州大学第十届程序设计竞赛

Problem A 神庙逃亡

水题

AC代码:

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

int s, h, vx, vy;

int main() {
	int w;
	cin >> w;

	while(w--){
		cin >> s >> h >> vx >> vy;
		long long int t = s / vx;
		long long q = vy * t - 5 * t* t;

		if( q > h){
			printf("good done!\n");
		}
		else{
			printf("poor Merida!\n");
		}
	}
	return 0;
}

Problem B 又见LKity

可以把匹配串s1全变为大写,原串s3中的也改为大写放到tmp中,匹配了就输出s2,不匹配就输出s3

AC代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
using namespace std;

char s1[105];
char s2[105];
char s3[50005];
char tmp[50005];

int lens1;

int judge(int x) {
	for(int i = 0; i < lens1; i ++) {
		if(tmp[x + i] != s1[i]) return 0;
	}
	return 1;
}

int main() {
	while(gets(s1) != NULL) {
		//getchar();
		lens1 = strlen(s1);
		gets(s2);
		gets(s3);
		int len = strlen(s3);
		for(int i = 0; i < len; i++) {
			if(s3[i] <= 'z' && s3[i] >= 'a') {
				tmp[i] = s3[i] - 32;
			}
			else tmp[i] = s3[i];
		}
		tmp[len] = '\0';

		for(int i = 0; s1[i] != '\0'; i++) {
			if(s1[i] <= 'z' && s1[i] >= 'a') s1[i] -= 32;
		}
		//printf("%s %s %s\n", s1, s3, tmp);

		for(int i = 0; i < len; i ++) {
			if(tmp[i] == s1[0]) {
				if(judge(i)) {
					i += lens1 - 1;
					printf("%s", s2);
				}
				else putchar(s3[i]);
			}
			else putchar(s3[i]);
		}
		printf("\n");
	}
	return 0;
}

Problem C 数字的孔数

水题

AC代码:

#include <cstdio>
using namespace std;

int a[10] = {1, 0, 0, 0, 1, 0, 1, 0, 2, 1};

int main() {
	int T;
	scanf("%d", &T);
	while(T --) {
		int n;
		scanf("%d", &n);
		int ans = 0;
		while(n) {
			ans += a[n % 10];
			n /= 10;
		}
		printf("%d\n", ans);
	}
	return 0;
}

Problem D 吃豆人

队友做的,貌似有点....

AC代码:

#include<cstdio>
#include<deque>
#include<cmath>
#include<cstring>
#include<algorithm>
#define INF 99999999.0
using namespace std;
class Node
{
public:
	int x,y;
	double v;
};
int n,m;
int sx,sy,ax,ay,bx,by;
int map[25][25];//0障碍,1空地,2加速器
double dist[25][25];
double dis[25][25];
bool tag[25][25];
char s[50];
void bfs1()
{
	double A,B,C;
	int i,j,l,r;
	deque<Node> Q;
	Node temp,tmp;temp.v=1.0;temp.x=sx;temp.y=sy;
	dist[sx][sy]=0;
	bool flag=0;
	Q.push_back(temp);
	while(!Q.empty())
	{
		temp=Q.at(0);
		Q.pop_front();flag=0;
		if(temp.x==ax)
		{
			if(temp.y<ay)
			{
				l=temp.y;r=ay;
			}
			else
			{
				l=ay;r=temp.y;
			}
			for(i=l;i<=r;i++)
				if(map[temp.x][i]==0)
					flag=1;
			if(flag==0&&dist[ax][ay]>dist[temp.x][temp.y]+abs(temp.y-ay)*2*0.1)
				dist[ax][ay]=dist[temp.x][temp.y]+abs(temp.y-ay)*2*0.1;
		}flag=0;
		if(temp.y==ay)
		{
			if(temp.x<ax)
			{
				l=temp.x;r=ax;
			}
			else
			{
				l=ax;r=temp.x;
			}
			for(i=l;i<=r;i++)
				if(map[i][temp.y]==0)
					flag=1;
			if(flag==0&&dist[ax][ay]>dist[temp.x][temp.y]+abs(temp.x-ax)*2*0.1)
				dist[ax][ay]=dist[temp.x][temp.y]+abs(temp.x-ax)*2*0.1;
		}
		if(temp.x-1>0&&dist[temp.x-1][temp.y]>dist[temp.x][temp.y]+temp.v&&map[temp.x-1][temp.y]!=0)
		{
			tmp.x=temp.x-1;tmp.y=temp.y;tmp.v=temp.v;
			dist[tmp.x][tmp.y]=dist[temp.x][temp.y]+temp.v;
			Q.push_back(tmp);
		}
		if(temp.x+1<=n&&dist[temp.x+1][temp.y]>dist[temp.x][temp.y]+temp.v&&map[temp.x+1][temp.y]!=0)
		{
			tmp.x=temp.x+1;tmp.y=temp.y;tmp.v=temp.v;
			dist[tmp.x][tmp.y]=dist[temp.x][temp.y]+temp.v;
			Q.push_back(tmp);
		}
		if(temp.y-1>0&&dist[temp.x][temp.y-1]>dist[temp.x][temp.y]+temp.v&&map[temp.x][temp.y-1]!=0)
		{
			tmp.x=temp.x;tmp.y=temp.y-1;tmp.v=temp.v;
			dist[tmp.x][tmp.y]=dist[temp.x][temp.y]+temp.v;
			Q.push_back(tmp);
		}
		if(temp.y+1<=m&&dist[temp.x][temp.y+1]>dist[temp.x][temp.y]+temp.v&&map[temp.x][temp.y+1]!=0)
		{
			tmp.x=temp.x;tmp.y=temp.y+1;tmp.v=temp.v;
			dist[tmp.x][tmp.y]=dist[temp.x][temp.y]+temp.v;
			Q.push_back(tmp);
		}
	}
}
double bfs2()
{
	deque<Node> Q;
	Node temp,tmp;temp.x=sx;temp.y=sy;temp.v=0.0;
	Q.push_back(temp);tag[sx][sy]=1;
	while(!Q.empty())
	{
		temp=Q.at(0);
		Q.pop_front();
		if(temp.x-1>0&&tag[temp.x-1][temp.y]==0&&map[temp.x-1][temp.y]!=0)
		{
			tmp.x=temp.x-1;tmp.y=temp.y;tmp.v=temp.v+1.0;
			if(tmp.x==bx&&tmp.y==by)
				return tmp.v;
			tag[tmp.x][tmp.y]=1;
			Q.push_back(tmp);
		}
		if(temp.x+1<=n&&tag[temp.x+1][temp.y]==0&&map[temp.x+1][temp.y]!=0)
		{
			tmp.x=temp.x+1;tmp.y=temp.y;tmp.v=temp.v+1.0;
			if(tmp.x==bx&&tmp.y==by)
				return tmp.v;
			tag[tmp.x][tmp.y]=1;
			Q.push_back(tmp);
		}
		if(temp.y-1>0&&tag[temp.x][temp.y-1]==0&&map[temp.x][temp.y-1]!=0)
		{
			tmp.x=temp.x;tmp.y=temp.y-1;tmp.v=temp.v+1.0;
			if(tmp.x==bx&&tmp.y==by)
				return tmp.v;
			tag[tmp.x][tmp.y]=1;
			Q.push_back(tmp);
		}
		if(temp.y+1<=m&&tag[temp.x][temp.y+1]==0&&map[temp.x][temp.y+1]!=0)
		{
			tmp.x=temp.x;tmp.y=temp.y+1;tmp.v=temp.v+1.0;
			if(tmp.x==bx&&tmp.y==by)
				return tmp.v;
			tag[tmp.x][tmp.y]=1;
			Q.push_back(tmp);
		}
	}
}
void bfs3()
{
	int i,j,l,r;
	deque<Node> Q;
	Node temp,tmp;temp.v=0.5;temp.x=bx;temp.y=by;
	dis[bx][by]=0;
	bool flag=0;
	Q.push_back(temp);
	while(!Q.empty())
	{
		temp=Q.at(0);
		Q.pop_front();flag=0;
		if(temp.x==ax)
		{
			if(temp.y<ay)
			{
				l=temp.y;r=ay;
			}
			else
			{
				l=ay;r=temp.y;
			}
			for(i=l;i<=r;i++)
				if(map[temp.x][i]==0)
					flag=1;
			if(flag==0&&dis[ax][ay]>dis[temp.x][temp.y]+abs(temp.y-ay)*2*0.1)
				dis[ax][ay]=dis[temp.x][temp.y]+abs(temp.y-ay)*2*0.1;
		}flag=0;
		if(temp.y==ay)
		{
			if(temp.x<ax)
			{
				l=temp.x;r=ax;
			}
			else
			{
				l=ax;r=temp.x;
			}
			for(i=l;i<=r;i++)
				if(map[i][temp.y]==0)
					flag=1;
			if(flag==0&&dis[ax][ay]>dis[temp.x][temp.y]+abs(temp.x-ax)*2*0.1)
				dis[ax][ay]=dis[temp.x][temp.y]+abs(temp.x-ax)*2*0.1;
		}
		if(temp.x-1>0&&dis[temp.x-1][temp.y]>dis[temp.x][temp.y]+temp.v&&map[temp.x-1][temp.y]!=0)
		{
			tmp.x=temp.x-1;tmp.y=temp.y;tmp.v=temp.v;
			dis[tmp.x][tmp.y]=dis[temp.x][temp.y]+temp.v;
			Q.push_back(tmp);
		}
		if(temp.x+1<=n&&dis[temp.x+1][temp.y]>dis[temp.x][temp.y]+temp.v&&map[temp.x+1][temp.y]!=0)
		{
			tmp.x=temp.x+1;tmp.y=temp.y;tmp.v=temp.v;
			dis[tmp.x][tmp.y]=dis[temp.x][temp.y]+temp.v;
			Q.push_back(tmp);
		}
		if(temp.y-1>0&&dis[temp.x][temp.y-1]>dis[temp.x][temp.y]+temp.v&&map[temp.x][temp.y-1]!=0)
		{
			tmp.x=temp.x;tmp.y=temp.y-1;tmp.v=temp.v;
			dis[tmp.x][tmp.y]=dis[temp.x][temp.y]+temp.v;
			Q.push_back(tmp);
		}
		if(temp.y+1<=m&&dis[temp.x][temp.y+1]>dis[temp.x][temp.y]+temp.v&&map[temp.x][temp.y+1]!=0)
		{
			tmp.x=temp.x;tmp.y=temp.y+1;tmp.v=temp.v;
			dis[tmp.x][tmp.y]=dis[temp.x][temp.y]+temp.v;
			Q.push_back(tmp);
		}
	}
}
int main()
{
	//freopen("xx.in","r",stdin);
	//freopen("xx.out","w",stdout);
	int i,j;double ans;
	double A,B,C;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		B=INF;
		for(i=1;i<=20;i++)
			for(j=1;j<=20;j++)
			{
				dist[i][j]=INF;
				dis[i][j]=INF;
			}
		memset(tag,0,sizeof(tag));
		for(i=1;i<=n;i++)
		{
			scanf("%s",s);
			for(j=0;j<m;j++)
			{
				if(s[j]=='P')
				{
					sx=i;sy=j+1;
				}
				if(s[j]=='B')
				{
					ax=i;ay=j+1;
				}
				if(s[j]=='S')
				{
					bx=i;by=j+1;
				}
				if(s[j]=='X')
					map[i][j+1]=0;
				if(s[j]=='S')
					map[i][j+1]=2;
				if(s[j]=='.'||s[j]=='B'||s[j]=='P')
					map[i][j+1]=1;
			}
		}
		bfs1();A=dist[ax][ay];
		B=bfs2();
		bfs3();C=dis[ax][ay];
		if(A<B+C)
			ans=A;
		else
			ans=B+C;
		if(INF-ans<1.000)
			printf("-1\n");
		else
			printf("%.1lf\n",ans);
	}
	return 0;
}

Problem E 简单的等式

其实也很简单,只要明确一点,x肯定小于等于根号n,然后从x = 根号n开始,往下枚举,不过直接枚举也会超时,所以可以发现s(x,m)是有一定范围的,当x一直减小的过程中,s(x, m)是增大的,所以可以适当设置一个度量,超出这个即跳出循环

AC代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <deque>
#include <cctype>
#define LL long long
#define INF 0x7fffffff
using namespace std;

LL T, n, m;
LL ans;

LL fun(LL x, LL m) {
	LL ret = 0;
	while(x) {
		ret += x % m;
		x /= m;
	}
	return ret;
}

int main() {
	scanf("%I64d", &T);
	while(T --) {
		scanf("%I64d %I64d", &n, &m);
		LL x = sqrt(n * 1.0);
		ans = -1;
		while(x) {
			if(n % x == 0) {
				LL sum = fun(x, m);
				if(sum == n / x - x) {
					ans = x;
				}
			}
			if(n / x - x > 100) {
				break;
			}
			x --;
		}
		cout << ans << endl;
	}
	return 0;
}

Problem G 养鸡场

直接枚举a1和a2肯定会超时,所以优化一下,只枚举a1的值,然后根据a3和各种制约推出a2的取值范围,只要知道a2的取值范围,a3也唯一确定

AC代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
using namespace std;

int x1, y1, x2, y2, x3, y3;
int n;

int main() {
	while(scanf("%d", &n) != EOF) {
		scanf("%d %d %d %d %d %d", &x1, &y1, &x2, &y2, &x3, &y3);
		LL ans = 0;
		for(int i = x1; i <= y1; i ++) {
			int L = max(i, max(x2, n - y3 - i) );
			L = max(L, n / 2 - i + 1);
			int R = min((n- i)/2, min(y2, n - x3 - i));
			if(R - L + 1 > 0) ans += (R - L + 1);
			//cout << L << " " << R << endl;
			//cout << ans << endl;
		}
		cout << ans << endl;
	}
	return 0;
}

时间: 2024-08-04 03:44:21

福州大学第十届程序设计竞赛 -- 部分题解的相关文章

FZU-2231 平行四边形数 From 福州大学第十三届程序设计竞赛

FZU-Problem 2231 平行四边形数 Accept: 66 Submit: 210 Time Limit: 2000 mSec Memory Limit : 32768 KB Problem Description 在一个平面内给定n个点,任意三个点不在同一条直线上,用这些点可以构成多少个平行四边形?一个点可以同时属于多个平行四边形. Input 多组数据(<=10),处理到EOF. 每组数据第一行一个整数n(4<=n<=500).接下来n行每行两个整数xi,yi(0<=

福州大学第十二届程序设计竞赛题解

A:这题利用单调栈,先预处理出每个位置向下的最远位置,那么每一行单独考虑,每行就相当于一些段的子矩阵个数,利用单调栈维护,每次出栈的时候把大于当前要入栈(高度0的不入栈了)的段的部分计算出来,累加一下答案即可 B:这题可以枚举,因为一个10^15开3方之后是10^5枚举起来是没有问题的,然后枚举一个数字i,等于要计算在max(a, i * i * i)到min(i * i * i, b)区间,有多少个x满足i * i * x在区间内,两边除下减下就能计算出答案了 C:并查集,注意每次合并的时候都

福州大学第十二届程序设计竞赛 (部分题解)

比赛链接:http://acm.fzu.edu.cn/contest/list.php?cid=144 Problem B 完美的数字 Time Limit: 1000 mSec    Memory Limit : 32768 KB Problem Description Bob是个很喜欢数字的孩子,现在他正在研究一个与数字相关的题目,我们知道一个数字的完美度是 把这个数字分解成三个整数相乘A*A*B(0<A<=B)的方法数,例如数字80可以分解成1*1*80,2*2*20 ,4*4*5,所以

东南大学第十三届程序设计竞赛初赛题解

问题 A: 天梯评分系统 题目描述 在一个下雨的日子,沈学姐和四个好基友约定无事一同打dota(dota是一个5对5的MOBA类游戏)因为想证明谁最NB,他们就全部注册新号去爬天梯了.天梯有一套完整的评分系统,它可以根据每位选手每局的数据进行评分,因为dota的英雄既有辅助又有ganker还有后期,所以不同的英雄的评分标准不一样.可惜那天天梯服务器维护,无法进行评分.于是,他们记录下每一局的数据,找你来帮忙,希望你能够帮他们仿照天梯编一个评分系统,以便于他们比较谁是真正的神牛. 已知对于每个账号

福州大学第十三届程序设计竞赛_重现

Problem A Calculus Midterm 题意:略 题解:~~ Problem B 翻翻棋 题意:略 题解:~~ Problem C 平行四边形数 题意:略 题解:~~ Problem D 炉石传说 题意:略 题解:最直接的一个做法就是二分图,跑一遍判断是否匹配的数量为n.还可以的一个做法是贪心:先把对手的血量从大到小排,然后对于自己,选一个能满足对方攻击的自身攻击力最小的一个随从,然后不断重复,最后判断有无可选即可. 1 /*zhen hao*/ 2 #include <cstdi

福州大学第十二届程序设计竞赛 B.完美的数字

Problem B 完美的数字 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description Bob是个很喜欢数字的孩子,现在他正在研究一个与数字相关的题目,我们知道一个数字的完美度是 把这个数字分解成三个整数相乘A*A*B(0<A<=B)的方法数,例如数字80可以分解成1*1*80,2*2*20 ,4*4*5,所以80的完美度是3:数字5只有一种分解方法1*1*5,所以完美度是1,假设数字x的完美度为d(x),现在

福州大学第十三届程序设计竞赛_重现总结

 Problem C 平行四边形数 Accept: 82    Submit: 425 Time Limit: 2000 mSec    Memory Limit : 32768 KB  Problem Description 在一个平面内给定n个点,任意三个点不在同一条直线上,用这些点可以构成多少个平行四边形?一个点可以同时属于多个平行四边形.  Input 多组数据(<=10),处理到EOF. 每组数据第一行一个整数n(4<=n<=500).接下来n行每行两个整数xi,yi(0<

2018年北京信息科技大学第十届程序设计竞赛暨ACM选拔赛-B-precise math function

题目描述 喜爱ACM的PBY同学遇到了一道数学难题,已知底数n,请你帮他准确的计算出结果a = nπ(n的π次方),结果保留小数点后x位. 输入描述: 第一行是一个整数t,表示测试实例的个数: 然后是t行输入数据,每行包含两个正整数n和x,表示底数和保留位数. (1 <= t <= 100,1 <= n <= 500,1 <= x <= 6) 输出描述: 对于每组输入数据,分别输出结果a,每个输出占一行. 示例1 输入 3 1 3 7 6 9 1 输出 1.000 45

HDU 6467 简单数学题 【递推公式 &amp;&amp; O(1)优化乘法】(广东工业大学第十四届程序设计竞赛)

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6467 简单数学题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 308    Accepted Submission(s): 150 Problem Description 已知 F(n)=∑i=1n(i×∑j=inCij) 求 F(n) m