1,猜灯谜
A 村的元宵节灯会上有一迷题:请你用计算机按小明的思路算一下,然后提交“请猜谜”三个字所代表的整数即可。
解题思路:思路很多:穷举,全排列。我写了一种不常见的。
#include
#define M 900
#define N 10
int judge(int num);
void init();
void check(int num);
int Num[M]={0},Length=0;
int main(void)
{
int i=0,j=0,k=0;
init();
for(i=0;i1) return 0;
num/=10;
}
return 1;
}
二,连续奇数和
小明看到一本书上写着:任何数字的立方都可以表示为连续奇数的和。请你帮助小明写出 111 的立方之连续奇数和表示法的起始数字。如果有多个表示方案,选择起始数字小的方案。
思路:可以总结出公式(end+begin)((end-begin)/2+1)/2后穷举
#include
int getValue(int begin,int end);
int main(void)
{
int i=0,j=111;
int num = j*j*j;
for(i=1;i
三:空白格式化
本次大赛采用了全自动机器测评系统。
如果你的答案与标准答案相差了一个空格,很可能无法得分,所以要加倍谨慎!以下代码实现了这个功能。仔细阅读代码,填写缺失的部分。
void f(char* from, char* to)
{
char* p_from = from;
char* p_to = to;
while(*p_from==' ' || *p_from=='\t' || *p_from=='\n') p_from++;
do
{
if(*p_from==' ' || *p_from=='\t' || *p_from=='\n')
{
do
{
p_from++;
}
while(*p_from==' ' || *p_from=='\t' || *p_from=='\n');
if(____________________) *p_to++ = ' '; //填空位置
}
}
while(*p_to++ = *p_from++);
}
解析在答案注释里
#include
void f(char* from, char* to);
int main(void)
{
char s[] = "I LOVE YOU! YES! THIS RIGHT!";
f(s,s);
puts(s);
return 0;
}
void f(char* from, char* to)
{
char* p_from = from; //from负责指针的移动,to负责改变字符串中的值(去除多余空格)
char* p_to = to;
//去除开头空白
while(*p_from==' ' || *p_from=='\t' || *p_from=='\n') p_from++;
do
{
if(*p_from==' ' || *p_from=='\t' || *p_from=='\n')
{
do //遇见空白则一直后移,知道该位为非空白位
{
p_from++;
}
while(*p_from==' ' || *p_from=='\t' || *p_from=='\n');
if(1) *p_to++ = ' '; //已经找到了两个字符间的所有空白位,用一个空白替代
}
}
while(*p_to++ = *p_from++); //退出条件:p_from的解引用值为空;
}
四,高僧斗法
古时丧葬活动中经常请高僧做法事。仪式结束后,有时会有“高僧斗法”的趣味节目,以舒缓压抑的气氛。
节目大略步骤为:先用粮食(一般是稻米)在地上“画”出若干级台阶(表示N级浮屠)。又有若干小和尚随机地“站”在某个台阶上。最高一级台阶必须站人,其它任意。(如图1所示)
两位参加游戏的法师分别指挥某个小和尚向上走任意多级的台阶,但会被站在高级台阶上的小和尚阻挡,不能越过。两个小和尚也不能站在同一台阶,也不能向低级台阶移动。输出为一行用空格分开的两个整数: A B, 表示把A位置的小和尚移动到B位置。若有多个解,输出A值较小的解,若无解则输出-1。
注意: 所有依赖的函数必须明确地在源文件中 #include
#include
#define M 101
int Distance[M]={0};
int main(void)
{
freopen("text.txt","r",stdin);
int a=0,b=0;
int i=0,j=0,k=0;
int length = 0,sum=0;
while(scanf("%d",&a)!=EOF) //记录下每两个相邻的和尚,前一个和尚距离后一个和尚之间的距离
{
i++;
if(i>1)
{
Distance[i-1] = a - b - 1;
}
b = a;
}
length = i;
for(j=1;j1) Distance[i-1]+=j;
for(k=1,sum=0;k<=length;k+=2)
{
sum ^= Distance[k];
}
if(sum==0)
{
printf("%d %d",i,i+j);
return 0;
}
Distance[i]+=j;
if(i>1) Distance[i-1]-=j;
}
}
}
return 0;
}
五,格子刷油漆
X国的一段古城墙的顶端可以看成 2*N个格子组成的矩形(如图1所示),现需要把这些格子刷上保护漆。例如:
用户输入:注意: 所有依赖的函数必须明确地在源文件中 #include
解题思路:数论,动态规划,网上有大佬做出来,具体忘了在哪看的。
#include
#define M 1001
#define MOD 1000000007
int main(void)
{
int a[M]={0},b[M]={0}; //a和b数组均统计从角落出发,这里以左上角为例
int i=0,j=0,k=0,n=0;
long long int sum=0;
scanf("%d",&n);
a[1] = 1;
for(i=2;i<=n;i++) //直接走到下一列,终点是左上角的下面一格
a[i] = (a[i-1]*2)%MOD;
b[1] = 1;
b[2] = 6;
for(i=3;i<=n;i++) //从左上角出发完整走一圈的所有可能。
//1,直接走到下一列
//2,直接走到下一行
//3,先遍历前两列(对角线)
b[i] = a[i] + 2 * b[i-1] + 4 * b[i-2];
sum = (b[n] * 4)%MOD;
for(i=2;i
六,农场阳光
X星球十分特殊,它的自转速度与公转速度相同,所以阳光总是以固定的角度照射。