奖券数目
直接暴力 答案 52488
#include<bits/stdc++.h>
using namespace std;
int main()
{
int ans=0;
for(int i=10000;i<=99999;i++)
{
int t=i;
bool ok=true;
while(t)
{
if(t%10==4)
{
ok=false;
break;
}
t/=10;
}
if(ok)ans++;
}
cout<<ans;
}
星系炸弹
excel填一下 2017-8-5
三羊献瑞
这题有意思了 可以用数学直接推出来
首先三必定是1,祥+1=10+羊(+1) 进位情况+1
- 有进位的情况 祥=10+羊 不成立 此处没有进位
- 因为没有进位 祥只能等于9,羊就等于0了
现在我们有瑞+羊=生,因为没有进位 瑞=生 不成立,所以我们有
1.生+献(+1)=10+瑞
2.瑞+1=生
对于1. 如果没有进位 综合1.2可以得出献等于9,不成立,所以必有进位
1.生+献+1=10+瑞
2.瑞+1=生
综合1.2.,可以推出献等于8
现在我们有
0 1 8 9
羊 三 献 祥
但是这不足以求出生和瑞。
我们继续往后看,由上一步有进位得出 辉+瑞=10+气
那么我们枚举一下生和瑞的可能
生 3 4 5 6 7
瑞 2 3 4 5 6
显然辉不等于8和9且气不等于0和1(三和羊)那么瑞=2,=3,=4的情况排除掉
生 6 7
瑞 5 6
瑞等于6 则生等于7 那么辉只能等于5或者4,此时又不成立
那么最后答案就出来了
9567
+1085
10652
第二种方法 直接搜
#include<bits/stdc++.h>
using namespace std;
int flag[11]={0};
//1 2 3 4 5 6 7 8
//三羊献瑞祥生辉气
int num[8]={0};
bool check(int n)
{
if(n/10000==num[1]&&n/1000%10==num[2]&&n/100%10==num[6]&&n/10%10==num[4]&&n%10==num[8])
{
return true;
}
return false;
}
void dfs(int cur)
{
if(cur>9)
{
int A=num[1]*1000+num[2]*100+num[3]*10+num[4];
int B=num[5]*1000+num[4]*100+num[6]*10+num[7];
int C=A+B;
if(check(C))
{
cout<<A<<"+"<<B<<"="<<C<<endl;
}
return;
}
// if(num[cur]==0)
for(int i=0;i<10;i++)
{
if(flag[i]==0)
{
num[cur]=i;
flag[i]=1;
dfs(cur+1);
flag[i]=0;
}
}
return;
}
int main()
{
dfs(1);
}
格子中输出
https://blog.csdn.net/rl529014/article/details/50737009
组分数
{t=x[k]; x[k]=x[i]; x[i]=t;}
加法变乘法
这道题有公式
1+2+3+…+48+49=1225
1+2+3+…(x-1)x+(y-1)y+…49=1225;
上式相减做差,得到
xx+yy-x-y-2=790;
我们直接枚举就得到xy了
当然你也可以先选一个x,算(x-1)*x,然后根据这个x做(y-1)y=2015-1225+x+x-1+y+y-1( x已经确定了)来确定y 最后判断一下就行了
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
for(int x=1;x<=50;x++)
{
for(int y=x+2;y<=50;y++)
{
if(x*x+y*y-x-y-2==790) cout<<x<<" "<<y<<endl;
}
}
}
牌型总数
每种牌0~4张,枚举一下所有可能的结果即可
#include <stdio.h>
int ans = 0, sum = 0;
void dfs(int cur,int sum)
{
if(sum>13)return;
if(cur==13)
{
if(sum==13) ans++;
return;
}
for(int i=0;i<5;i++) dfs(cur+1,sum+i);
}
int main()
{
dfs(0,0);
printf("%d",ans);
return 0;
}
移动距离
这道题不难 只是要仔细想
两个数之间的距离为 它们所在行相减+它们所在列相减
所在行我们直接用相除就行了
所在列呢?
观察样例 偶数列从左往右填数,奇数列从右往左填数,那么我们根据这个规律找一下x,y所在的列即可
代码
#include<bits/stdc++.h>
using namespace std;
int w,m,n;
void fun(int row,int num,int &cnt)
{
//偶 从左到有
if(row%2==0)
{
int temp=row*w+1;
while(temp!=num)
{
temp++;
cnt++;
}
}
else
{
int temp=(row+1)*w;
while(temp!=num)
{
temp--;
cnt++;
}
}
}
int main()
{
//宽度,楼号
cin>>w>>m>>n;
int ans=0;
//m,n的行
int mr=m/(w+1);
int nr=n/(w+1);
ans+=abs(mr-nr);
//计算m,n的列
int mw=0,nw=0;
fun(mr,m,mw);
fun(nr,n,nw);
ans+=abs(mw-nw);
cout<<ans;
}
累骰子 生命之树
不会QAQ