CodeChef2015年8月问题

来源:互联网 发布:校园暴力看待 知乎 编辑:程序博客网 时间:2024/05/02 06:45

COOKMACH

(1)问题描述:对于一个整数,支持两种操作,除以2或者乘以2,给定一个整数A,问经过最少多少次操作可以变成B(B为2的幂)。

(2)要点分析:水题,先将a不断除以2使得a是b的因子,再不断乘以2使得a等于b。

(3)代码:

#include <stdio.h>int main(){unsigned int nCases = 0;scanf("%d",&nCases);for(unsigned int iCases = 1;iCases <= nCases;++iCases){unsigned int a = 0,b = 0;scanf("%d%d",&a,&b);unsigned int ans = 0;for(;0 != (b%a);++ans,a /= 2);for(;a != b;a *= 2,++ans);printf("%u\n",ans);}return 0;}


GRGUY

(1)问题描述:

(2)要点分析:参考代码中的状态转移方程

(3)代码:

#include <stdio.h>#include <string.h>#include <vector>#include <assert.h>using std::vector;int main(){static const unsigned int buff_size = 1000000;unsigned int nCases = 0;scanf("%d",&nCases);char* abuff = new char[buff_size+1];char* bbuff = new char[buff_size+1];for(unsigned int iCases = 1;iCases <= nCases;++iCases){scanf("%s%s",abuff,bbuff);size_t len = strlen(abuff);assert(len == strlen(bbuff));vector<unsigned int> dps[2];dps[0].resize(len,(unsigned int)(-1));dps[1].resize(len,(unsigned int)(-1));char* buff[2] = { 0 };buff[0] = abuff;buff[1] = bbuff;if(abuff[0] == '.') dps[0][0] = 0;if(bbuff[0] == '.') dps[1][0] = 0;for(size_t i = 1;i < len;++i){for(unsigned int k = 0;k < 2;++k){if(buff[k][i] == '#') dps[k][i] = (unsigned int)(-1);// else if(buff[k][i-1] == '.') dps[k][i] = dps[k][i-1];// buff[k][i] == buff[k][i-1] == '.'else if(buff[1-k][i-1] == '#')dps[k][i] = (unsigned int)(-1);// buff[k][i] == '.' && buff[k][i-1] == '#' && buff[1-k][i-1] == '#'else dps[k][i] = (unsigned int)(-1) == dps[1-k][i-1]?(unsigned int)(-1):(dps[1-k][i-1] + 1);}}unsigned int ans = (unsigned int)(-1);if(dps[0][len-1] < ans) ans = dps[0][len-1];if(dps[1][len-1] < ans) ans = dps[1][len-1];if((unsigned int)(-1) != ans) printf("Yes\n%u\n",ans);else printf("No\n");}delete[] abuff;delete[] bbuff;return 0;}



ADMAG

(1)问题描述:

(2)要点分析:枚举前面几项可以知道,实际是求大于n的Fibonacci数的下标

(3)代码:

#include <stdio.h>#include <assert.h>int main(){static const unsigned int maxsize = 87;unsigned long long fibonacci[maxsize] = { 1,2 };for(unsigned int i = 2;i < maxsize;++i) fibonacci[i] = fibonacci[i-1] + fibonacci[i-2];unsigned int nCases = 0;scanf("%d",&nCases);for(unsigned int iCases = 1;iCases <= nCases;++iCases){unsigned long long n = 0;scanf("%lld",&n);unsigned int ans = 0;for(;n >= fibonacci[ans];++ans);printf("%u\n",ans);}return 0;}

0 0
原创粉丝点击