返校后的第一场,来看看三道水题
A. Alex Origami Squares
思路:将一个矩形内分割出三个同样大小的正方形,由于同样大小和并且是边长相同的正方形而且确定了数目为三个,那么一切都变得简单了,三个正方形只有1*3,2*2,3*1三种摆法,将这三种取个最大值即可
/*
Author Owen_Q
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#include <cmath>
#include <string>
#include <queue>
#include <stack>
using namespace std;
const int maxn = 1e5+10;
int main()
{
int h,w;
while(scanf("%d%d",&h,&w)!=EOF)
{
double dh = h;
double dw = w;
double d1 = min(dw,dh/3);
double d2 = min(dh,dw/3);
double d12 = max(d1,d2);
double d3 = min(dw/2,dh/2);
double dd = max(d12,d3);
printf("%.6lf\n",dd);
}
return 0;
}
L. Lucky Chances
思路:又是一个遍历搜索的问题,一开始把数据范围看错了,一维是1e3的于是直接将自己想到的O(n^3)的算法否定了,想着先O(n^2)预处理每个位置四个方向的最大值,即是否可以取该方向,然后再O(n^2)判断一遍,后来发现数据范围只有1e2,O(n^3)的暴力也完全可以,其实也无妨,写个预处理也并没有花费太多时间,就这样吧,反正过了就好
/*
Author Owen_Q
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#include <cmath>
#include <string>
#include <queue>
#include <stack>
using namespace std;
const int maxn = 1e3+10;
int l[maxn][maxn];
bool up[maxn][maxn];
bool down[maxn][maxn];
bool rig[maxn][maxn];
bool lef[maxn][maxn];
int main()
{
int r,c;
while(scanf("%d%d",&r,&c)!=EOF)
{
memset(up,false,sizeof(up));
memset(down,false,sizeof(down));
memset(rig,false,sizeof(rig));
memset(lef,false,sizeof(lef));
for(int i=0;i<r;i++)
{
for(int j=0;j<c;j++)
{
scanf("%d",&l[i][j]);
}
}
for(int i=0;i<r;i++)
{
int maxl = 0;
for(int j=0;j<c;j++)
{
if(l[i][j]>maxl)
{
lef[i][j] = true;
maxl = l[i][j];
}
}
maxl = 0;
for(int j=c-1;j>=0;j--)
{
if(l[i][j]>maxl)
{
rig[i][j] = true;
maxl = l[i][j];
}
}
}
for(int j=0;j<c;j++)
{
int maxl = 0;
for(int i=0;i<r;i++)
{
if(l[i][j]>maxl)
{
up[i][j] = true;
maxl = l[i][j];
}
}
maxl = 0;
for(int i=r-1;i>=0;i--)
{
if(l[i][j]>maxl)
{
down[i][j] = true;
maxl = l[i][j];
}
}
}
int sum = 0;
for(int i=0;i<r;i++)
{
for(int j=0;j<c;j++)
{
if(up[i][j])
{
sum++;
}
if(down[i][j])
{
sum++;
}
if(lef[i][j])
{
sum++;
}
if(rig[i][j])
{
sum++;
}
}
}
printf("%d\n",sum);
}
return 0;
}
E. Easy Arithmetic
思路:这是一个细节题,改写数学表达式,可以合法地添加任意符合使表达式值最大,那么思路很简单,“+”后面肯定不用动,毕竟越加越大,“-”后面肯定要填“+”,一开始想了好多细节,后来发现越细越容易出错,越容易有疏漏,归一化处理,才会比较容易考虑全面。
最后的思路就是,寻找到“-”,在“-”后面第二个数字开始计算,找到第一个不为0的数,在该数和其前面的0前都添加“+”就可以了,如此归一化成一个完整操作,注意一下全0的提前终止就好了,最后,一定要注意char型字符‘0’和整型数字0的区别,确实有坑
/*
Author Owen_Q
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#include <cmath>
#include <string>
#include <queue>
#include <stack>
using namespace std;
const int maxn = 1e5+10;
char s[maxn];
bool add[maxn];
int main()
{
while(scanf("%s",s)!=EOF)
{
memset(add,false,sizeof(add));
int len = strlen(s);
for(int sta=0;sta<len;sta++)
{
if(s[sta] == '-')
{
int pos = sta+1;
if(pos==len-1)
{
break;
}
else if(s[pos+1]>='0'&&s[pos+1]<='9')
{
while(pos+1<len&&s[pos+1]=='0')
{
pos++;
add[pos] = true;
}
if((pos+1 < len) && (s[pos+1]>'0')&& (s[pos+1] <= '9'))
{
//cout << pos <<"*"<< endl;
//cout << s[pos+1] << endl;
//cout << (s[pos+1]>'0')<<"*"<< (s[pos+1] <= '9') << endl;
add[pos+1] = true;
pos++;
}
}
sta = pos;
}
}
for(int p=0;p<len;p++)
{
if(add[p])
{
printf("+");
}
printf("%c",s[p]);
}
printf("\n");
}
return 0;
}