1.今天做题遇到了一个小问题,就是给我报了个警告,记录一下:
overflow in implicit constant conversion [-Woverflow]
翻译: 隐式常量转换中的溢出
百度解释:
常量转换溢出。C语言中char, int, float, double,unsigned char, unsigned int 等数值有极限范围,当它们之间(隐式)转换时,可能因 数值极限 而超界 溢出。有的编译器会报告这一类型的错误,
并不是所有编译器都会报告。
溢出例子:
int i=129; // 赋常量 129
char c=i; // char 型 129 超界 溢出 -- 并不是所有编译器都会报告
printf("%d \n",c); // 输出 -127 -- 显然 不是想要的结果。
--
溢出例子:
typedef int T1;
typedef char T2;
T1 x =256;
T2 y = x; // char 型 256 超界 溢出
-- 并不是所有编译器都会报告这里“overflow in implicit constant conversion“
2.上午解决了一道
Perket 是一种流行的美食。为了做好 Perket,厨师必须谨慎选择食材,以在保持传统风味的同时尽可能获得最全面的味道。你有 nn 种可支配的配料。对于每一种配料,我们知道它们各自的酸度 ss 和苦度 bb。当我们添加配料时,总的酸度为每一种配料的酸度总乘积;总的苦度为每一种配料的苦度的总和。
众所周知,美食应该做到口感适中,所以我们希望选取配料,以使得酸度和苦度的绝对差最小。
另外,我们必须添加至少一种配料,因为没有任何食物以水为配料的。
输入格式
第一行一个整数 nn,表示可供选用的食材种类数。
接下来 nn 行,每行 22 个整数 s_isi 和 b_ibi,表示第 ii 种食材的酸度和苦度。
输出格式
一行一个整数,表示可能的总酸度和总苦度的最小绝对差。
输入输出样例
输入 #1复制
1 3 10
输出 #1复制
7
输入 #2复制
2 3 8 5 8
输出 #2复制
1
输入 #3复制
4 1 7 2 6 3 8 4 9
输出 #3复制
1
说明/提示
数据规模与约定
对于 100\%100% 的数据,有 1 \leq n \leq 101≤n≤10,且将所有可用食材全部使用产生的总酸度和总苦度小于 1 \times 10^91×109,酸度和苦度不同时为 11 和 00。
这道题我用的最傻的方法,就是一个dfs然后一个个的找,找到符合就跳出。。。
#include<bits/stdc++.h>
using namespace std;
int a[20],b[20],vis[20];
int ans=99999999999;
int n,num1=0,num2=1;;
void dfs(int k)
{
if(k>n)
return ;
else
{
for(int i=1;i<=n;i++)
{
if(vis[i]==0)
{
num1+=b[i];//将苦味累加
num2*=a[i];//将酸味累乘
ans=min(abs(num1-num2),ans);
vis[i]=1;
dfs(k+1);
vis[i]=0;//回溯取消标记
num1-=b[i];
num2/=a[i];
}
}
}
}
int main()
{
scanf("%d",&n);//正常的输入输出了
for(int i=1;i<=n;i++)
{
scanf("%d %d",&a[i],&b[i]);
}
dfs(1);
printf("%d",ans);
}
3.下午
水坑问题
思路:先找到一个W,计数器加一,然后搜索将他周围的‘ . ’变成‘W’,然后又开始找‘W’重复就可以了,最后输出计算器的大小就ok了
第1行:两个空格隔开的整数:N 和 M 第2行到第N+1行:每行M个字符,每个字符是'W'或'.',它们表示网格图中的一排。字符之间没有空格。
输出格式
一行:水坑的数量
输入输出样例
输入 #1复制
10 12 W........WW. .WWW.....WWW ....WW...WW. .........WW. .........W.. ..W......W.. .W.W.....WW. W.W.W.....W. .W.W......W. ..W.......W.
输出 #1复制
3
#include<bits/stdc++.h>
using namespace std;
char a[110][110];//地图
int n,m,ans;
int fx[8]={-1,-1,-1,0,0,1,1,1};//移动
int fy[8]={-1,0,1,-1,1,-1,0,1};
void dfs(int x,int y)
{
a[x][y]='.'; //先将进来的'W'变成'.'
int xx,yy;
for(int i=0;i<8;i++)
{
xx=x+fx[i];//往旁边走一格
yy=y+fy[i];
if(xx<1||yy<1||xx>n||yy>m||a[xx][yy]=='.')//判断是否越界和合法
continue ;
a[xx][yy]='.';//不越界及合法的话
dfs(xx,yy);
}
}
int main()
{
scanf("%d %d",&n,&m);//输入
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j]=='W')//找出每次变化后的地图里面的'W'
{
ans++;//计数器++;
dfs(i,j);//开始搜索
}
}
}
printf("%d",ans);//输出个数
}
下面就说说我做了这些bfs和dfs题目的一些总结。
1.dfs适合那些要计算个数,要全部统计完全的题目。而bfs适合那些路程最短的最优解问题。
2.dfs相对于bfs而言,代码简单并且容易理解,但是时间复杂度一般要高一点。
3.要使用bfs和dfs的话除了模板,还有就是要找出每道题的结束判断,和下一步搜素的条件,这个才是最关键的。
个人见解,请大佬们多多指教。