总结:
1. 题目输入输出是:
需要加上
freopen("alex.in","r",stdin); freopen("alex.out","w",stdout);
2. 四方搜索可以用两次线性规划解决
Problem A. Alex Origami Squares
题意:给一个矩形,在矩形内放3个相同的正方形,求正方形最长的长度
#include<bits/stdc++.h>
#include<stdlib.h>
using namespace std;
int main()
{
freopen("alex.in","r",stdin);
freopen("alex.out","w",stdout);
int h,w;
cin>>h>>w;
int t;
if(h<w)
{
t=h;
h=w;
w=t;
}
int i;
if(h>=3*w)
printf("%lf\n",w*1.0);
else
{
if(h<(1.5*w))
printf("%lf\n",(w*1.0)/2);
else printf("%lf\n",(h*1.0)/3);
}
return 0;
}
Concatenation
**题意:**合成字符串:a字符串从左向右,b 字符串从右向左…说不清楚
总结:可以背下来,以后碰到计算两字符串相同字符个数时可以直接用
疑问: 为什么a,b字符串长度需要100000+10 (为什么+10)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
freopen("concatenation.in","r",stdin);
freopen("concatenation.out","w",stdout);
char a[100000+10];
char b[100000+10];
scanf("%s\n",a);
scanf("%s",b);
long long int aa[100000+10]={0};
long long int alen=strlen(a);
long long int blen=strlen(b);
long long int x=alen*blen;
int i;
for(i=1;i<alen;i++)
{
aa[ a[i] ]++;
}
for(i=0;i<blen-1;i++)
{
x-=aa[b[i]];
}
printf("%lld\n",x);
return 0;
}
L - Lucky Chances
题意:如果某个方向都比该数小,那么该方向就为win,求某矩阵win的方向总数
题解:
两次动态规划
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
freopen("lucky.in","r",stdin);
freopen("lucky.out","w",stdout);
long long int num=0;
int n,m;
scanf("%d %d",&n,&m);
int a[n+1][m+1];
int b[n+1][m+1][2];
int i,j;
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
if(i==0)
{
b[i][j][1]=1;
num++;
}
if(j==0)
{
b[i][j][0]=1;
num++;
}
if(j!=0)
{
if(b[i][j-1][0]==1)
{
if(a[i][j]>a[i][j-1])
{
b[i][j][0]=1;
num++;
}
else
{
b[i][j][0]=a[i][j-1];
}
}
else
{
if(a[i][j]>b[i][j-1][0])
{
b[i][j][0]=1;
num++;
}
else
{
b[i][j][0]=b[i][j-1][0];
}
}
}
if(i!=0)
{
if(b[i-1][j][1]==1)
{
if(a[i][j]>a[i-1][j])
{
b[i][j][1]=1;
num++;
}
else
{
b[i][j][1]=a[i-1][j];
}
}
else
{
if(a[i][j]>b[i-1][j][1])
{
b[i][j][1]=1;
num++;
}
else
{
b[i][j][1]=b[i-1][j][1];
}
}
}
}
}
for(i=n-1; i>=0; i--)
{
for(j=m-1; j>=0; j--)
{
if(i==n-1)
{
b[i][j][1]=1;
num++;
}
if(j==m-1)
{
b[i][j][0]=1;
num++;
}
if(j!=m-1)
{
if(b[i][j+1][0]==1)
{
if(a[i][j]>a[i][j+1])
{
b[i][j][0]=1;
num++;
}
else
{
b[i][j][0]=a[i][j+1];
}
}
else
{
if(a[i][j]>b[i][j+1][0])
{
b[i][j][0]=1;
num++;
}
else
{
b[i][j][0]=b[i][j+1][0];
}
}
}
if(i!=n-1)
{
if(b[i+1][j][1]==1)
{
if(a[i][j]>a[i+1][j])
{
b[i][j][1]=1;
num++;
}
else
{
b[i][j][1]=a[i+1][j];
}
}
else
{
if(a[i][j]>b[i+1][j][1])
{
b[i][j][1]=1;
num++;
}
else
{
b[i][j][1]=b[i+1][j][1];
}
}
}
}
}
printf("%lld",num);
return 0;
}