Link:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=2234
土豪银行 | ||||||
|
||||||
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 | ||||||
|
||||||
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程序设计竞赛(热身) |
#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; }
#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); } }
围巾的纠结 | ||||||
|
||||||
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; }