思路:有手就行
#include
using namespace std;
int main() {
for(int a=0; a<100; ++a)
for(int b=0; b<100; ++b)
if(a<b&&((2.3*a+1.9*b)==82.3))
cout<<a;
return 0;
}
答案:11
思路:自己画一画,前几个是这样的:
对折次数 | 得到面条数目 |
---|---|
0 | 2=2 0+1 |
1 | 3=21+1 |
2 | 5=22+1 |
3 | 9=23+1 |
4 | 17=24+1 |
… | … |
n | 2n+1 |
这个是找规律的
#include
#include
using namespace std;
int main(){
cout<<pow(2,10)+1;
return 0;
}
答案:1025
思路:同2013年的“第三十九级台阶”:https://blog.csdn.net/firewater23/article/details/107719282#3_60
#include
using namespace std;
int ans=0;
void fun(int wine,int shop,int flower){
//题目说最后一次遇到的是花,正好喝完酒
//也就是还剩下一朵花,一斗酒,店肯定是没了的
if(flower==1&&wine==1&&shop==0){
ans++;
return ;
}
//这里两种情况要分类,注意if语句的判断
if(shop>0) fun(wine*2,shop-1,flower);
if(flower>0) fun(wine-1,shop,flower-1);
}
int main(){
fun(2,5,10);
cout<<ans;
return 0;
}
答案:14
思路:没啥思路
看到while语句里的条件是r==0,内部里面第一个if语句里是r<0
那么下面肯定也是个if语句,并且条件是r>0,这个应该不难猜到
然后后面的执行语句肯定和i有关,不然循环出不去,然后不可能和上一句一样,也是i+1,就没意义了。试着试着就出来了。
for(i=5; i>=0; i--) {
int r = strcmp(level[i], buf);
if(r<0) return i+1;
while(r==0) {
p += 6;
strncpy(buf,p,6);
r = strcmp(level[i], buf);
if(r<0) return i+1;
if(r>0) return i; //填空
}
}
答案:if(r>0) return i
思路:这个似乎也是试出来的
要填第一行,我先是用rank=3带进去分别注释掉第二行和第三行,结果都是最后一行**有变化,说明要我们补全的第一行肯定是上方的空白部分
那整体格式就是f(a, rank-1, ,);
后面两个值就一边试一边看运行结果,然后修改。
void f(char a[][N], int rank, int row, int col) {
if(rank==1) {
a[row][col] = '*';
return;
}
int w = 1;
int i;
for(i=0; i<rank-1; i++) w *= 2;
f(a, rank-1, row, col+w/2);//上边的几层 填空处 @ 第一行
f(a, rank-1, row+w/2, col);//最左边的一颗 @ 第二行
f(a, rank-1, row+w/2, col+w);//最右边的一颗 @ 第三行
}
答案:f(a, rank-1, row, col+w/2)
思路:可以暴力枚举加以判断,可以深搜再判断。
注意: 但对于分子分母相同的情况,2/2 乘以 3/3 这样的类型太多了,不在计数之列!
#include
#include
using namespace std;
int ans=0;
int a[9]= {0};
void dfs(int n) {
if(n==4) {
if(a[0]!=a[1]&&a[2]!=a[3])
if (a[0] * a[2] * (a[1] * 10 + a[3]) == a[1] * a[3] * (a[0] * 10 +a[2]))
ans++;
return ;
}
for(int i=0; i<9; ++i) {
a[n]=i+1;
dfs(n+1);
}
}
int main() {
dfs(0);
cout<<ans;
return 0;
}
答案:14
思路:这是一道典型的深搜题目。
坑点是你需要给出的数组要去除题目已经给到的,数字1 3 8 都是不能再次出现的
一道题目是无法明白深搜的,需要自己多看多练
#include
#include
using namespace std;
int num[9]= {2,4,5,6,7,9,10,11,12};
bool vis[9]={0};
int a[10];
bool isOk() {
int s1,s2,s3,s4,s5,s6;
s1=1+a[1]+a[9]+a[5];
s2=1+a[2]+a[4]+a[8];
s3=a[3]+a[2]+a[1]+8;
s4=a[3]+a[4]+a[7]+3;
s5=a[5]+a[6]+a[7]+a[8];
s6=8+3+a[9]+a[6];
if(s1==s2&&s2==s3&&s3==s4&&s4==s5&&s5==s6) {
printf("%d",a[9]);
return 1;
}
}
void Dfs(int n) {
if(n==10&&isOk())
return ;
for(int i=0; i<9; i++)
if(!vis[i]) {
a[n]=num[i];
vis[i]=1;
Dfs(n+1);
vis[i]=0;
}
}
int main() {
Dfs(1);
return 0;
}
答案:10
起初想到的是把这些数字取绝对值放在另一个数组里,然后sort一下,标记第一个感冒的蚂蚁的位置,然后解决正负的方向,就有点昏了,主要是没想到“穿过**”。
参考了https://blog.csdn.net/computer_liuyun/article/details/23350077
思路:
蚂蚁相遇传染感冒,同时两个都掉头,此时两个都感冒。
这里的相遇掉头其实是穿过,因为两个都感冒了,不再区分哪个蚂蚁往哪边走 。
总的蚂蚁感冒数=左边向右的蚂蚁+右边向左的蚂蚁+本身
特殊情况 :
第一只蚂蚁向左,并且它的左边没有向右的。
第一只蚂蚁向右,并且它的右边没有向左的。
这两种情况任意发生一种都会导致第一个蚂蚁无法将感冒传给其他蚂蚁
#include
#include
using namespace std;
int a[50];//存放蚂蚁位置的数组
int n;
int main() {
cin>>n;
for(int i=0; i<n; ++i)
cin>>a[i];
//a[0]是感冒的蚂蚁
int left=0,right=0;
for(int i=1; i<n; ++i) {
if(a[i]>0) { //向右走
if(abs(a[i])<abs(a[0])) //在感冒蚂蚁的左边
right++;
}
if(a[i]<0) { //向左走
if(abs(a[i])>abs(a[0])) //在感冒蚂蚁的右边
left++;
}
}
//处理特殊情况
if((a[0]<0&&right==0)||(a[0]>0&&left==0))
cout<<"1";
else cout<<left+right+1;
return 0;
}