洛谷试炼场---新手村
在线测评地址https://www.luogu.com.cn/training/mainpage
1.p1001 A+B Problem
难度:入门难度
考点:输入,输出 ,整数四则运算
适用:小学生
#include
int main(){
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",a+b);
return 0;
}
2.p1421 小玉买文具
难度:入门难度
考点:输入,输出,整数的四则运算
适用:小学生
#include
int main(){
int a,b,c;
scanf("%d%d",&a,&b);
c=(a*10+b)/19;
printf("%d\n",c);
return 0;
}
3.p1425 小鱼的游泳时间 类似 P1421 小玉买文具
难度:入门难度
考点:输入,输出 ,整数四则运算,取整,取模
适用:小学生
#include
int main(){
int a,b,c,d;
int e,f,g,h,i;
scanf("%d%d%d%d",&a,&b,&c,&d);
e=a*60+b;
f=c*60+d;
g=f-e;
h=g/60;
i=g%60;
printf("%d %d\n",h,i);
return 0;
}
4.p1422 小玉家的电费
难度:入门难度
考点:输入,输出 ,浮点数计算,if else语句
适用:小学生
#include
int main(){
int a;
float b;
scanf("%d",&a);
if(a<=150)
b=a*0.4463;
else if(a>=151&&a<=400)
b=150*0.4463+(a-150)*0.4663;
else if(a>400)
b=150*0.4463+(400-150)*0.4663+(a-400)*0.5663;
printf("%.1f\n",b);
return 0;
}
5.p1085 不高兴的津津
难度:入门难度
考点:输入,输出 ,整数四则运算,数组,找最大值
适用:小学生
技巧:大于等于8,痛苦指数为a+b,否者为0
#include
int main(){
int a,b,c[8],i,max,k;
for(i=1;i<=7;i++){
scanf("%d%d",&a,&b);
if(a+b>=8)
c[i]=a+b;
else
c[i]=0;
}
max=0;
k=0;
for(i=1;i<=7;i++)
if(max
6.NOIP2004 提高组 复赛 save 津津的储蓄计划
1.题目对程序知识要求比较简单,主要考思考。
2.需要开sheng(剩),cun(存)两个变量对每个月的结余进行处理。
3.两个关键点,一是cun*1.2不合适,因cun是整数,不能与浮点直接相乘,可以采用cun/10*12。
4.二是,别忘了手中的钱还要加上12月剩的钱,即cun/10*12+sheng。
5.样例通过后,提交AC。
耗时:15分钟
难度:简单
附上AC代码,编译环境Dev-C++4.9.9.2
//2004 save
#include
int ys[13];
int main(){
int i;
int sheng,cun;
int flag;
for(i=1;i<=12;i++)
scanf("%d",&ys[i]);
sheng=0;
cun=0;
flag=0;
for(i=1;i<=12;i++){
sheng=sheng+300-ys[i];
if(sheng<0){
flag=1;
break;
}
if(sheng>=100){
cun=cun+(sheng/100)*100;
sheng%=100;
}
}
if(flag)
printf("%d\n",i*(-1));
else
printf("%d\n",cun/10*12+sheng);
}
7.//p1008 三连击
//难度:入门难度
//考点:输入,输出 ,整数四则运算,取整,取模
//适用:小学生
//小技巧:分离出每个数的个十百位,其中 1*2*3*4*5*6*7*8*9=362880 1+2+3+4+5+6+7+8+9=45能判定数字是否重复
//方法:枚举
#include
int main(){
int a,b,c;
int x[10];
int m,n,i;
for(a=123;a<=333;a++){
b=a*2;
c=a*3;
x[1]=a%10;
x[2]=a/10%10;
x[3]=a/100;
x[4]=b%10;
x[5]=b/10%10;
x[6]=b/100;
x[7]=c%10;
x[8]=c/10%10;
x[9]=c/100;
m=1;
n=0;
for(i=1;i<=9;i++)
m*=x[i];
for(i=1;i<=9;i++)
n+=x[i];
if(m==362880&&n==45)//1*2*3*4*5*6*7*8*9 1+2+3+4+5+6+7+8+9//笔误,写成3628880查了会
printf("%d %d %d\n",a,b,c);
}
}
p1008 三连击
难度:入门难度
考点:输入,输出 ,整数四则运算,深度优先算法
适用:小学生
#include
#include
int a[10];
int visited[10];
int n=9;
void dfs(int step){
int b,c,d;
int i;
b=a[1]*100+a[2]*10+a[3];
c=a[4]*100+a[5]*10+a[6];
d=a[7]*100+a[8]*10+a[9];
if(step==n+1){
if(c==2*b&&d==3*b)
printf("%d %d %d\n",b,c,d);
return;
}
for(i=1;i<=9;i++)
if(visited[i]==0){
a[step]=i;
visited[i]=1;
dfs(step+1);
visited[i]=0;
}
}
int main(){
memset(visited,0,sizeof(visited));
dfs(1);
return 0;
}
8.p1035 级数求和
难度:入门难度
考点:输入,输出 ,整数、浮点数运算,
适用:小学生
陷阱:此题写得不好,容易超时
感悟:测试 12时,已经反应很慢了,比较忐忑. 提交果然超时。本题的特点是容易测试,发现问题,就需要找出超时的问题,进行改进。
#include
int main(){
int k;
int i;
double ans;
scanf("%d",&k);
ans=1;
i=1;
while(1){
if(ans>k)
break;
i++;
ans+=1.0/i;
}
printf("%d\n",i);
return 0;
}
9.p1307 数字反转
难度:入门难度
考点:输入,输出 ,取整,取模,分离出个十百千万位数,数组
适用:小学生
陷阱:如9000,反转后是9,不容易想到。
#include
int main(){
int n;
int a[20];
int top;
int flag;
int i,j;
scanf("%d",&n);
if(n==0){//n=0处理
printf("0\n");
return 0;
}
if(n>0)//大于0
flag=1;
else{//小于0
flag=-1;
n*=-1;
}
top=-1;
while(n){
top++;
a[top]=n%10;
n/=10;
}
if(flag==-1)
printf("-");
j=0;
while(a[j]==0&&j<=top)
j++;
for(i=j;i<=top;i++)
printf("%d",a[i]);
return 0;
}
//p1307 数字反转
//难度:入门难度
//考点:输入,输出 ,整数四则运算,取整,取模
//适用:小学生
#include
int main(){
int n;
int ans=0;
scanf("%d",&n);
if(n<0){
printf("-");
n=-n;
}
while(n){
ans*=10;
ans+=n%10;
n/=10;
}
printf("%d\n",ans);
return 0;
}
10.p1423 小玉在游泳
难度:入门难度
考点:输入,输出 ,浮点数计算
适用:小学生
#include
int main(){
float x;
int i;
float step;
float ans;
scanf("%f",&x);
i=1;
step=2;
ans=step;
while(ans
11.p1424 小鱼的航程(改进版)
难度:入门难度
考点:输入,输出 ,取模
适用:小学生
陷阱:结束时间是n+x-1
#include
int main(){
int x,n;
int i;
int ans;
int end;
scanf("%d%d",&x,&n);
ans=0;
end=n+x;
for(i=x;i
12.p1980 计数问题
难度:入门难度
考点:输入,输出 ,取整,取模,分离出整数的个十百千万
适用:小学生
#include
int cal(int a,int x){
int ans;
ans=0;
while(a){
if(a%10==x)
ans++;
a/=10;
}
return ans;
}
int main(){
int n,x;
int i;
int ans;
scanf("%d%d",&n,&x);
ans=0;
for(i=1;i<=n;i++)
ans+=cal(i,x);
printf("%d\n",ans);
return 0;
}
13.p1046 陶陶摘苹果
难度:入门难度
考点:输入,输出 ,整数四则运算,数组
适用:小学生
感悟:菜题
#include
int main(){
int h[10+10];
int i;
int t;
int count=0;
for(i=0;i<10;i++)
scanf("%d",&h[i]);
scanf("%d",&t);
for(i=0;i<10;i++)
if(t+30>=h[i])
count++;
printf("%d\n",count);
return 0;
}
14.p1047 校门外的树
难度:入门难度
考点:输入,输出 ,整数数组操作
适用:小学生
注意:过大的数组要开到main函数的外面
int a[10000+10];
#include
int main(){
int L,m;
int i,j,start,end;
int remain;
scanf("%d%d",&L,&m);
for(i=0;i<=L;i++)
a[i]=1;
for(i=0;i
15.p1427 小鱼的数字游戏
难度:入门难度
考点:输入,输出 ,一维数组操作
适用:小学生
#include
int a[100+10];
int main(){
int v;
int count=0;
int i;
scanf("%d",&v);
while(v){
a[count]=v;
count++;
scanf("%d",&v);
}
printf("%d",a[count-1]);
for(i=count-2;i>=0;i--)
printf(" %d",a[i]);
printf("\n");
return 0;
}
16.p1428 小鱼比可爱
难度:入门难度
考点:输入,输出 ,一维数组操作
适用:小学生
#include
#include
int a[1000+10];
int b[1000+10];
int main(){
int n;
int i,j;
memset(b,0,sizeof(b));
scanf("%d",&n);
for(i=0;i
for(i=0;i
printf("%d",b[0]);
for(i=1;i
printf("\n");
return 0;
}
17.p1055 ISBN号码
难度:入门难度
考点:输入,输出 ,字符串,字符转数字,数字转字符
适用:小学生
注意:过大的数组要开到main函数的外面。
小技巧:要设置一个计数变量
陷阱:没注意%11,结果可能是0,1,2,3,4,5,6,7,8,9,10 10是两位数,题目太简单了,容易漏看:所得的余数即为识别码,如果余数为10,则识别码为大写字母X
#include
int main(){
char s[20];
int ans;
scanf("%s",s);
ans=(s[0]-'0')*1+(s[2]-'0')*2+(s[3]-'0')*3+(s[4]-'0')*4;
ans+=(s[6]-'0')*5+(s[7]-'0')*6+(s[8]-'0')*7+(s[9]-'0')*8+(s[10]-'0')*9;
ans%=11;
if(ans==10)
if(s[12]=='X')
printf("Right\n");
else{
s[12]='X';
printf("%s\n",s);
}
else if(ans==s[12]-'0')
printf("Right\n");
else{
s[12]=ans+'0';
printf("%s\n",s);
}
return 0;
}
18.p1200 你的飞碟在这儿
难度:入门难度
考点:输入,输出 ,字符串操作,字符转数字,取模
适用:小学生
#include
#include
int main(){
char hui[10],dui[10];
int h,d;
int hlen,dlen;
int i;
scanf("%s%s",hui,dui);
hlen=strlen(hui);
dlen=strlen(dui);
h=1;
d=1;
for(i=0;i
19.//p1308 统计单词数
//难度:普及-
//考点:输入,输出 ,含空格字符串读取
//适用:小学生
//注意:过大的数组要开到main函数的外面。
//陷阱:题目比较刁钻,第二行提供的字符串,开始部分也可以是空格,真是难以想象啊,测试数据1,8就是。
#include
#include
#include
char s1[20];
char s2[1000000+10];
int main(){
int count=0;
char c;
int i,j;
int s1len,s2len;
int flag;
int num,k;
scanf("%s",s1);
//字符串s2读取,比较费力
while((c=getchar())!=EOF)
if(c!='\r'&&c!='\n')
s2[count++]=c;
while(!isalpha(s2[count-1]))
count--;
s2[count]='\0';
s1len=strlen(s1);
s2len=strlen(s2);
//s1,s2字符串,转化成小写
for(i=0;i='A'&&s1[i]<='Z')
s1[i]='a'+s1[i]-'A';
for(i=0;i='A'&&s2[i]<='Z')
s2[i]='a'+s2[i]-'A';
num=0;
for(i=0;i0)
printf("%d %d\n",num,k);
else
printf("-1\n");
return 0;
}
20.//p1553 数字反转(升级版)
//难度:普及-
//考点:输入,输出 ,字符串处理,字符查找,字符串反转
//适用:小学生
//小技巧:输出%技巧 %%
//陷阱:陷阱,输出应该用字符串,若用整数,容易越界。
//附上该题测试点9奇葩的输入输出数据额:1390000.00000000 931.0
//附上该题测试点12奇葩的输入输出数据额:000000000/8213 0/3128
//感悟:升级版题目很难做,奇葩数据特别多。似乎不按常理出牌
#include
#include
char s[100],s2[100],s3[100],t[100];
void fun(char *a){
int i,j,len,b;
char t[100];
len=strlen(a);
if(len==1)
return;
strcpy(t,a);
i=0;
j=0;
while(t[i]=='0')
i++;
while(t[i]!='\0'){
a[j]=t[i];
i++;
j++;
}
a[j]='\0';
len=strlen(a);
if(len==0){
a[0]='0';
a[1]='\0';
}
}
int main(){
int len;
int i,j,m;
int flag;//整0.1/2%3
int k;
scanf("%s",s);
len=strlen(s);
flag=0;
for(i=0;i
21.//p1598 垂直柱状图
//难度:普及-
//考点:输入,输出 ,字符串读取,字符转数字,数字转字符,矩阵读写
//适用:小学生
//陷阱:Dev-C++4.9.9.2竟无数组越界提醒 ,查了好半天
#include
#include
int a[100];//数组开的太小,越界,查了好半天a[50]
char b[100][100];//数组开的太小,越界,查了好半天b[50][50]
int main(){
char c;
int max,i,j;
memset(a,0,sizeof(a));
while((c=getchar())!=EOF){
if(c>='A'&&c<='Z')
a[c-'A']++;
}
max=0;
for(i=0;i<26;i++)
if(max
22.p1914 小书童---密码
难度:入门难度
考点:输入,输出 ,字符串,字符处理,取模
适用:小学生
#include
#include
char s[1024];
int main(){
int n;
int i;
int len;
scanf("%d%s",&n,s);
len=strlen(s);
for(i=0;i
23.//p1028 数的计算
//难度:普及-
//考点:输入,输出 ,递归
//适用:小学生
//小技巧:先将各种情况打印出,之后注释,再进行各种可能结果统计。
//疑惑:测试n=1000,明显超时,但提交AC,很明显,数据弱
#include
//int a[1000];
//int pos;
long long count=0;
void fun(int n){
int i,j,top;
for(i=1;i<=n/2;i++){
/*pos++;
a[pos]=i;
top=pos;
printf(",");
for(j=top;j>=0;j--)
printf("%d",a[j]);*/
count++;
fun(i);
//pos--;
}
}
int main(){
int n;
scanf("%d",&n);
/*printf("%d",n);
pos=0;
a[pos]=n;*/
count++;
fun(n);
printf("%lld\n",count);
return 0;
}
24.//p1036 选数
//难度:普及-
//考点:输入,输出 ,递归,排列组合,质数的判定,深度优先遍历,阶乘计算
//适用:初中
//小技巧:深度优先遍历,数据有重复,别忘了/f(k) 阶乘
#include
#include
int a[30],b[30],vis[30];
int n,k;
int count=0;
int f(int n){//阶乘
if(n==1)
return 1;
return f(n-1)*n;
}
int isprime(int n){//0非质数,1质数
int i;
if(n==1)
return 0;
if(n==2)
return 1;
for(i=2;i*i<=n;i++)
if(n%i==0)
return 0;
return 1;
}
void dfs(int step){
int i,j,sum;
if(step==k+1){
sum=0;
for(j=1;j<=k;j++)
sum+=a[j];
if(isprime(sum))
count++;
return ;
}
for(i=1;i<=n;i++)
if(vis[i]==0){
vis[i]=1;
a[step]=b[i];
dfs(step+1);
vis[i]=0;
}
}
int main(){
int i;
memset(vis,0,sizeof(vis));
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++)
scanf("%d",&b[i]);
dfs(1);
printf("%d\n",count/f(k));
return 0;
}
25.//p1149 火柴棒等式
//难度:普及-
//考点:输入,输出 ,数组,取整,取模,将一个整数的个十百千万等位取出。
//适用:小学生
//小技巧:穷举法,做了个超时测试i<=10000,j<=10000,发现算出答案与i<=1000,j<=1000相一致,提交时采用1000
//猜测:数据都在1000以内,因24-4=20等于10个1
#include
int b[10]={6,2,5,5,4,5,6,3,7,6};//0-9火柴根数
int fun(int n){
int sum=0;
if(n==0)
return b[0];
while(n){
sum+=b[n%10];
n/=10;
}
return sum;
}
int main(){
int i,j,n,m,count=0;
scanf("%d",&n);
for(i=0;i<=1000;i++)
for(j=0;j<=1000;j++){
m=fun(i)+fun(j)+fun(i+j)+4;
if(m==n)
count++;
}
printf("%d\n",count);
return 0;
}
26.//p1217 回文质数
//难度:普及-
//考点:输入,输出 ,质数判定,回文数生成技巧
//适用:小学生
//注意:过大的数组要开到main函数的外面。
//感悟:开始还没什么头绪,但接着题目往下看,题目还有详细的提示。
//思路:枚举题目范围内的所有回文数,判定质数进行存储,在题目给定的方位内进行查找
#include
int a[10000];//存储质数
int count=0;//质数个数
int isprime(int n){//质数返回1,非质数返回0
int i;
if(n==1)
return 0;
if(n==2)
return 1;
for(i=2;i*i<=n;i++)
if(n%i==0)
return 0;
return 1;
}
void palindrome(){
int d1,d2,d3,d4,d5,t;
//1个数
for(d1=1;d1<=9;d1+=2)
if(isprime(d1))
a[count++]=d1;
//2个数
for(d1=1;d1<=9;d1+=2){
t=d1*10+d1;
if(isprime(t))
a[count++]=t;
}
//3个数
for(d1=1;d1<=9;d1+=2)
for(d2=0;d2<=9;d2++){
t=d1*100+d2*10+d1;
if(isprime(t))
a[count++]=t;
}
//4个数
for(d1=1;d1<=9;d1+=2)
for(d2=0;d2<=9;d2++){
t=d1*1000+d2*100+d2*10+d1;
if(isprime(t))
a[count++]=t;
}
//5个数
for(d1=1;d1<=9;d1+=2)
for(d2=0;d2<=9;d2++)
for(d3=0;d3<=9;d3++){
t=d1*10000+d2*1000+d3*100+d2*10+d1;
if(isprime(t))
a[count++]=t;
}
//6个数
for(d1=1;d1<=9;d1+=2)
for(d2=0;d2<=9;d2++)
for(d3=0;d3<=9;d3++){
t=d1*100000+d2*10000+d3*1000+d3*100+d2*10+d1;
if(isprime(t))
a[count++]=t;
}
//7个数
for(d1=1;d1<=9;d1+=2)
for(d2=0;d2<=9;d2++)
for(d3=0;d3<=9;d3++)
for(d4=0;d4<=9;d4++){
t=d1*1000000+d2*100000+d3*10000+d4*1000+d3*100+d2*10+d1;
if(isprime(t))
a[count++]=t;
}
//8个数
for(d1=1;d1<=9;d1+=2)
for(d2=0;d2<=9;d2++)
for(d3=0;d3<=9;d3++)
for(d4=0;d4<=9;d4++){
t=d1*10000000+d2*1000000+d3*100000+d4*10000+d4*1000+d3*100+d2*10+d1;
if(isprime(t))
a[count++]=t;
}
//9个数
for(d1=1;d1<=9;d1+=2)
for(d2=0;d2<=9;d2++)
for(d3=0;d3<=9;d3++)
for(d4=0;d4<=9;d4++)
for(d5=0;d5<=9;d5++){
t=d1*100000000+d2*10000000+d3*1000000+d4*100000+d5*10000+d4*1000+d3*100+d2*10+d1;
if(isprime(t))
a[count++]=t;
}
}
int main(){
int a2,b;
int i;
palindrome();
scanf("%d%d",&a2,&b);
for(i=0;i=a2&&a[i]<=b)
printf("%d\n",a[i]);
else if(a[i]>b)
break;
return 0;
}
2017-7-24 6:56 重新修改 p1217 回文质数
27.//p1478 陶陶摘苹果(升级版)
//难度:普及-
//考点:输入,输出 ,数组,结构体,排序
//适用:小学生
//注意:存在力气用不完,苹果已摘完;存在力气不够用苹果已摘完。
//思路:找出能摘到的苹果,按消耗的力气由小到大排序。第一遍扫描,将能摘到的苹果存下来,采用结构体,数据比较清晰。
#include
struct node{
int x;
int y;
}p[5000+10],p_t;//苹果
int main(){
int n,s;
int i,j;
int x,y;
int a,b;
int count=0;
int num=0;
scanf("%d%d",&n,&s);
scanf("%d%d",&a,&b);
for(i=0;i=x){//存能摘到的苹果
p[count].x=x;
p[count].y=y;
count++;
}
}
for(i=0;ip[j].y){
p_t=p[i];
p[i]=p[j];
p[j]=p_t;
}
for(i=0;i=p[i].y){
s=s-p[i].y;
num++;
}else
break;
printf("%d\n",num);
return 0;
}
28.//p1618 三连击(升级版)
//难度:普及-
//考点:输入,输出 ,整数四则运算,数组,递归,深度优先遍历。
//适用:小学生
//陷阱:编得高兴的时候,容易漏了 若无解,输出“No!!!”
#include
#include
int A,B,C;
int a[10],vis[10];
int count=0;
void dfs(int step){
int i;
int b1,b2,b3;
if(step==10){
b1=a[1]*100+a[2]*10+a[3];
b2=a[4]*100+a[5]*10+a[6];
b3=a[7]*100+a[8]*10+a[9];
if(b1*B*C==b2*A*C&&b2*A*C==b3*A*B){
count++;
printf("%d %d %d\n",b1,b2,b3);
}
}
for(i=1;i<=9;i++)
if(vis[i]==0){
vis[i]=1;
a[step]=i;
dfs(step+1);
vis[i]=0;
}
}
int main(){
memset(vis,0,sizeof(vis));
scanf("%d%d%d",&A,&B,&C);
dfs(1);
if(count==0)
printf("No!!!\n");
return 0;
}
29.//p1579 哥德巴赫猜想(升级版)
//难度:普及-
//考点:输入,输出 ,判断质数,数组
//适用:小学生
//思考:将2000以内的素数全部找出,三层循环,判断,输出符合条件的数据。
#include
int a[20000];
int count=0;
int isprime(int n){//0非质数 1质数
int i;
if(n==1)
return 0;
if(n==2)
return 1;
for(i=2;i*i<=n;i++)
if(n%i==0)
return 0;
return 1;
}
void find(){
int i;
for(i=1;i<20000;i++)
if(isprime(i))
a[count++]=i;
}
int main(){
int i,j,k;
int n;
int flag=0;
find();
scanf("%d",&n);
for(i=0;i
30.//p2089 烤鸡
//难度:入门难度
//考点:输入,输出 ,暴力,或深度优先遍历
//适用:小学生
//注意:过大的数组要开到main函数的外面。
//陷阱:没想到解的数量十分巨大,如何计算接的数量,(3333333333-1111111111)=2222222222还要研究
//思路:准备暴力破解,但for循环有10个,写得难受,采用dfs方式缩减代码。
//收获:成功的将多层for循环写成递归的形式,dfs搜索更上一层楼。
#include
int a[100000][20],b[20];//a[20][20]开得太小了,导致WA 1000也要WA于是开到100000
int count=0;
int n;
void dfs(int step){
int i,j;
int sum;
if(step==11){
sum=0;
for(j=1;j<=10;j++)
sum+=b[j];
if(sum==n){
for(j=1;j<=10;j++)
a[count][j]=b[j];
count++;
}
return;
}
for(i=1;i<=3;i++){
b[step]=i;
dfs(step+1);
}
}
int main(){
int i,j;
scanf("%d",&n);
if(n>30){
printf("0\n");
return 0;
}
dfs(1);
printf("%d\n",count);
for(i=0;i
31.//p1426 小鱼会有危险吗
//难度:入门难度
//考点:输入,输出 ,等比数列,浮点数运算
//适用:知识(高中生),编程(小学生)
//陷阱:测试点2挺奇葩的,3 4 y一开始就在猎人捕杀范围
//疑惑:时间足够长,小鱼有可能没进猎捕范围就停下了。应该要判断。 经过等比数列计算a1/1-q=350米,故不用判断。
#include
int main(){
float s,x;
float dis,sp;
scanf("%f%f",&s,&x);
dis=0;//第0秒
if(dis>=s-x){//特列判断
dis=7;//第一秒
if(dis<=s+x)
printf("y\n");
else
printf("n\n");
return 0;
}
dis=sp=7;//第一秒
while(diss+x)
printf("n\n");
else
printf("y\n");
return 0;
}
32.//p1464 Function
//难度:普及-
//考点:输入,输出 ,整数四则运算,取整,取模
//适用:小学生
//注意:过大的数组要开到main函数的外面。
//小技巧:要设置一个计数变量
//陷阱:输出格式w(1, 1, 1) = 2注意有4个空格。 此题陷阱多多
//思考:题目的输入数据挺吓人,采用long long,看完题目突然看到记忆化搜索,正好2017-3-17
//看到《挑战程序设计竞赛(第2版)》巫泽俊 里有介绍,那么编起程序是手到擒来。
//提交:没有经过优化竟然全报TLE,突然醒悟到记忆化搜索该怎么编。再次提交RE,明白数组开小了
//注意:输入负数要单独处理,题目没看仔细,负数,或是超大的数都单独处理即可。生手毕竟生手。
#include
#define n 30//改了mem[100][100][100]此处没改成30又折腾了一会
long long mem[30][30][30];//mem[30][30][30]太小了 ,后来一看,开得够大了
long long w(long long a,long long b,long long c){
if(a<=0||b<=0||c<=0)
return 1;
if(a>20||b>20||c>20){
if(mem[20][20][20]==0)
mem[20][20][20]=w(20,20,20);
return mem[20][20][20];
}
if(a20||b>20||c>20){
if(mem[20][20][20]==0)
mem[20][20][20]=w(20,20,20);
printf("w(%lld, %lld, %lld) = %lld\n",a,b,c,mem[20][20][20]);
}
else{
if(mem[a][b][c]==0)
mem[a][b][c]=w(a,b,c);
printf("w(%lld, %lld, %lld) = %lld\n",a,b,c,mem[a][b][c]);
}
}
return 0;
}
33.配上该幅图,该题所要表达的意思就清楚了,不过纯粹由提供的数据想到该图对应的取数方法,还是很困难的。
//p1014 Cantor表
//难度:入门难度
//考点:输入,输出 ,找规律
//适用:小学生
//小技巧:同一对角线上,分子降序,分母升序 ,分子+分母=定值
//配上该幅图,该题所要表达的意思就清楚了,不过纯粹由提供的数据想到该图对应的取数方法,还是很困难的。
#include
int main(){
int n,i;//n分子,i分母
int ascend;//分子升序1,降序0
scanf("%d",&n);
i=1;
ascend=0;
while(n>i){
n=n-i;
i++;
ascend=!ascend;
}
if(ascend==0){//降序
n=i-n+1;//分子处理
}
i=i-n+1;
printf("%d/%d\n",n,i);
return 0;
}
2017-3-19 上午10:20完结。
新手村通关。水平得以提升,掌握了多行字符串(包含空格)的处理,深度优先遍历(其中包括将多层循环写成递归形式),记忆搜索。