哈尔滨理工大学第五届ACM程序设计竞赛(热身)


Link:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=2234


土豪银行
Time Limit: 500 MS Memory Limit: 32768 K
Total Submit: 123(66 users) Total Accepted: 67(57 users) Rating:  Special Judge: No
Description
你是一个土豪,于是你决定发行自己的钱币。考虑到你是一个土豪,传统的一角,五毛,一块,五元,十块,五十元,一百块的币种机制,会让你印太多太多的钱币,这就很费纸,非常不环保。(你想100,000,000得多少张纸?嗯,没错,你是一个土豪……)
后来一天睡醒之后,你梦到一个数字P。于是你有了一个好注意:你的银行只发行P的次方的面值的纸币。意思是,你的银行只发行1, P,P^2, P^3, P^4 ...面额的纸币。(^表示指数,不是C语言中的异或)。
对于一个给定的P,当来了另一个土豪,想取款Q元时,你能否算出,你的银行最少需要给这位土豪多少张钱呢?
Input
第一行一个整数T,表示数据组数。(T < 500)
每组数据只有一行,包含两个数P,Q(0 < P,Q <= 10000)
Output
对于每组输入,输出一个整数,表示银行最少要给的钱的张数。
Sample Input
3
2 9
3 9
4 9
Sample Output
2
1
3
Source
哈尔滨理工大学第五届ACM程序设计竞赛(热身)

AC  code:

#include<iostream>
#include<stdio.h>
#include<map>
#include<vector>
#include<set>
#include<cstdlib>
#include<string.h>
#include<string>
#include<algorithm>
#include<cmath>
#define MAXN 1000010
#define EPS 1e-9
using namespace std;
int dp[MAXN],c[MAXN];
int main()
{
	//freopen("in.txt","r",stdin);
	int i,j,cnt,p,q,t,v;
	while(cin>>t)
	{
		while(t--)
		{
			cin>>p>>q;
			if(p==1)
			{
				printf("%d\n",q);
			}
			else
			{
			    cnt=0;
				c[++cnt]=1;
				v=p;
				while(v<=q)
				{
					c[++cnt]=v;
					v*=p;
				}
				memset(dp,999999,sizeof(dp));
				dp[0]=0;
				for(i=1;i<=cnt;i++)
				{
					for(j=c[i];j<=q;j++)
					{
						dp[j]=min(dp[j-c[i]]+1,dp[j]);
					}
				}
				printf("%d\n",dp[q]);
			}
		}
	}
	
	return 0;
}


Link:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=2236

Duang
Time Limit: 500 MS Memory Limit: 32768 K
Total Submit: 99(47 users) Total Accepted: 48(43 users) Rating:  Special Judge: No
Description
小破最近在一片空地上打了很多坑挖宝,可是都没有结果。就在她要放弃的那个晚上,她突然仰望天空,发现天上的星星连成一个字:duang。
她立刻跑到最近的一个坑,发现下面金光闪闪!她惊喜万分,掏出纸笔开始计算:
已知刚才她仰望天空的位置,和她打的所有坑的位置,那么她刚才跑到最近的一个坑,最少需要几步呢?
假设把空地看成一个n*n的格子,小破傻傻的,一步要么横着走一格,要么竖着走一格。注意,小破从原先位子上站起来也算一步。
Input
多组测试数据
每组测试数据第一行有三个正整数n,x,y。
n代表空地的长宽(n <= 100),(x,y)代表小破仰望天空的位置(1 <= x,y <= n)。

接下来n行表示空地的情况,'#'表示小破在此处打了一个坑,'.'表示没有打过坑。

数据保证小破最开始不在坑里。

Output
对于每组数据,输出小破到达一个坑所需要的最少的步数。
Sample Input
3 1 1
...
.#.
..#
4 1 1
..#.
..#.
.#..
#...
Sample Output
3
3
Source
哈尔滨理工大学第五届ACM程序设计竞赛(热身)
 
AC code:

#include<iostream>
#include<stdio.h>
#include<map>
#include<vector>
#include<set>
#include<cstdlib>
#include<string.h>
#include<string>
#include<queue>
#include<algorithm>
#include<cmath>
#define MAXN 1000010
#define EPS 1e-9
using namespace std;
int d[4][2]={-1,0,0,-1,1,0,0,1};
bool vis[111][111];
char m[111][111];
int n;
struct node{
	int sp;
	int x;
	int y;
}st;
int bfs()
{
	queue<node>q;
	node now,nex;
	memset(vis,false,sizeof(vis));
	int i;
	q.push(st);
	vis[st.x][st.y]=true;
	while(!q.empty())
	{
		now=q.front();
		q.pop();
		for(i=0;i<4;i++)
		{
			nex.x=now.x+d[i][0];
			nex.y=now.y+d[i][1];
			if(nex.x>=0&&nex.x<n&&nex.y>=0&&nex.y<n&&!vis[nex.x][nex.y])
			{
				nex.sp=now.sp+1;
				if(m[nex.x][nex.y]=='#')
				{
					return nex.sp;
				}
				q.push(nex);
				vis[nex.x][nex.y]=true;
			}
		}
	}
	
}
int main()
{
	//freopen("in.txt","r",stdin);
	int x,y,i,j;
	while(cin>>n>>x>>y)
	{
		for(i=0;i<n;i++)
		{
			cin>>m[i];
		}
		st.sp=1;
		st.x=x-1;
		st.y=y-1;
		cout<<bfs()<<endl;
	}
	return 0;
}


1128: 出租车费

时间限制: 1 Sec
内存限制: 32 MB
提交: 535
解决: 149
提交 状态

题目描述

某市出租车计价规则如下:起步4公里10元,即使你的行程没超过4公里;接下来的4公里,每公里2元;之后每公里2.4元。行程的最后一段即使不到1公里,也当作1公里计费。
一个乘客可以根据行程公里数合理安排坐车方式来使自己的打车费最小。
例如,整个行程为16公里,乘客应该将行程分成长度相同的两部分,每部分花费18元,总共花费36元。如果坐出租车一次走完全程要花费37.2元。
现在给你整个行程的公里数,请你计算坐出租车的最小花费。

输入

输入包含多组测试数据。每组输入一个正整数n(n<10000000),表示整个行程的公里数。
当n=0时,输入结束。

输出

对于每组输入,输出最小花费。如果需要的话,保留一位小数。

样例输入

39160

样例输出

1020.436


AC code:

#include<stdio.h>
int main()
{
    int n,a,b,sum1;
    double sum;
    while(scanf("%d",&n)&&n)
    {
        sum=0;
        a=n/8;
        b=n%8;
        sum+=a*18;
        if(b<5)
        {
            if(a!=0)
                sum+=b*2.4;
            else
                sum+=10;
        }
        else
        {
            sum+=10+(b-4)*2;
        }
        sum1=(int)sum;
        if(sum==sum1)
            printf("%d\n",sum1);
        else
            printf("%.1lf\n",sum);
    }
}


Link: http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=2238
围巾的纠结
Time Limit: 500 MS Memory Limit: 32768 K
Total Submit: 94(45 users) Total Accepted: 46(41 users) Rating:  Special Judge: No
Description

小破想要织一条围巾,可是她并不擅长于织围巾。由于工作太忙,每天她都只能织一点。为了快速的织完围巾,她决定直接把毛线球连在一起。围巾上有球球还是非常可爱的嘛~

    于是小破去商店买了n个毛线球。每天晚上睡觉之前,她就抽出一点时间,把其中两个原本分开的毛线球织在一起。由于是睡觉之前干活,人太困了,过了m天之后,她发现自己完全织乱了,于是她决定拆掉重织。可是由于她的织法过于特殊,她发现,一旦几个毛线球被织成了一个圈,就不能完好的解开了。现在她想知道,她还能把这条"围巾"还原吗?
Input
多组测试数据
每组测试数据第一行有两个整数n,m(1 <= n <= 10000, 1 <= m <= 1000000)
接下来有m行,每行有两个数a,b,表示将a和b号毛球织到一起。
Output
对于每组测试数据,如果她能还原,则输出"YES", 否则输出"NO"
Sample Input
5 4
1 2
2 3
3 1
1 4
5 4
1 2
2 3
3 4
4 5
Sample Output
NO
YES
Source
哈尔滨理工大学第五届ACM程序设计竞赛(热身)



AC  code:

#include<iostream>
#include<stdio.h>
#include<map>
#include<vector>
#include<set>
#include<cstdlib>
#include<string.h>
#include<string>
#include<queue>
#include<algorithm>
#include<cmath>
#define MAXN 1000010
#define EPS 1e-9
using namespace std;
int n,m,a,b;
int fa[MAXN];
void init()
{
	for(int i=1;i<=n;i++)
	{
		fa[i]=i;
	}
}
int fin(int root)
{
	int son,tmp;
	son=root;
	while(root!=fa[root])
	{
		root=fa[root];
	}
	while(son!=root)
	{
		tmp=fa[son];
		fa[son]=root;
		son=tmp;
	}
	return root;
}
bool join(int x,int y)
{
	int r1,r2;
	r1=fin(x);
	r2=fin(y);
	if(r1!=r2)
	{
		fa[r1]=r2;
		return true;
	}
	return false;
}
int main()
{
	//freopen("in.txt","r",stdin);
	int fg;
	while(cin>>n>>m)
	{
		fg=1;
		init();
		while(m--)
		{
			cin>>a>>b;
			if(!join(a,b))
			{
				fg=0;
			}
		}
		if(fg)
		{
			printf("YES\n");
		}
		else
		{
			printf("NO\n");
		}
	}
	return 0;
}


你可能感兴趣的:(算法,动态规划,ACM)