确实感觉今天完全不在状态,一堆小问题。其实这次思路挺好的,做的两题都是一上来就有思路,没出现什么卡壳。然而,细节往往是决定成败的重大因素
A. Sagheer and Crossroads
思路:很常规的情景题,细心读题,判断就好了,关键就是耐心分析情景,注意细节(人行道位置),一定不能着急,确保正确理解题意,看完全部样例再做题。
不过这题这次问题的真正原因在于,改了一波程序后最后在循环节处忽略了取余,最后得到最坏结果可能数组越界两倍了,这都能过pre确实有点意外,很无奈啊
/*
Author:Owen_Q
*/
#include <bits/stdc++.h>
using namespace std;
bool light[4][4];
int main()
{
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
int temp;
scanf("%d",&temp);
light[i][j] = (temp == 1 ? true : false) ;
}
}
bool accident = false;
for(int i=0;i<4;i++)
{
if(!light[i][3])
{
continue;
}
for(int j=0;j<3;j++)
{
if(light[i][j])
{
accident = true;
break;
}
if(light[(i+j+1)%4][j])
{
accident = true;
break;
}
}
}
if(accident)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
return 0;
}
B. Sagheer, the Hausmeister
思路:这题由于规定关完一层楼所有灯后再上楼,于是就相当于一个局部贪心问题。不过由于每次贪心不仅有步数,不同结果还会对位置造成影响,于是添加一个dp,对于两边不同位置分别求一个贪心,再选取最小值进行转移。其实这题的思路还是挺顺畅的,不过卡了不少位置
1.数据读入时数值相连,要以字符串读取
2.楼层数据读入时倒序
3.上楼数计入
4.i,j分辨避免楼层跳跃
5.由贪心向dp转化,思路的变更
6.初始化问题
7.一楼独立考虑
8.修改位置变量,做表转化
9.将不可能数据与相同数据归一化处理
10.中间结果的修改后及时对后方相关结果进行更新,避免结果造成影响
状态有点糟糕了,好好睡一觉吧
/*
Author:Owen_Q
*/
#include <bits/stdc++.h>
using namespace std;
bool light[15][110];
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
//cout << m << "*" << n << endl;
for(int i=n-1;i>=0;i--)
{
bool unready = false;
char temp[110];
scanf("%s",temp);
for(int j=0;j<m+2;j++)
{
//cout << i << "**" << j << endl;
if(temp[j] == '1')
{
unready = true;
light[i][j] = true;
}
else
{
light[i][j] = false;
}
}
light[i][0] = unready;
}
//cout << "***" << endl;
bool ready = true;
for(int i=n-1;i>=0;i--)
{
if(light[i][0])
{
ready = false;
}
light[i][m+1] = ready;
}
if(light[0][m+1])
{
printf("%d\n",0);
continue;
}
int lefsum = 0;
int rigsum = 0;
int lef = 0;
int rig = 0;
if(light[0][0])
{
int newlef = 0;
int newrig = 0;
for(int j=1;j<=m;j++)
{
if(light[0][j])
{
newlef = j;
break;
}
}
for(int j=m;j>=newlef;j--)
{
if(light[0][j])
{
newrig = j;
break;
}
}
lefsum = newrig;
lef = newrig;
rigsum = newrig;
rig = newrig;
}
else
{
lefsum = m+1;
lef = m+1;
rigsum = 0;
rigsum = 0;
}
for(int i=1;i<n;i++)
{
if(light[i][m+1])
{
break;
}
lefsum++;
rigsum++;
if(!light[i][0])
{
continue;
}
int newlef = 0;
int newrig = 0;
for(int j=1;j<=m;j++)
{
if(light[i][j])
{
newlef = j;
break;
}
}
for(int j=m;j>=newlef;j--)
{
if(light[i][j])
{
newrig = j;
break;
}
}
int sum1,sum2;
int templefsum,templef;
sum1 = lefsum;
sum2 = rigsum;
sum1 += (lef + newrig);
sum2 += (rig + newrig);
//cout << i<<"*"<<sum << "*" << minlen <<"*" << newlef <<"*" <<newrig<< endl;
templef = newrig;
templefsum = sum1 < sum2 ? sum1 : sum2;
int temprigsum,temprig;
sum1 = lefsum;
sum2 = rigsum;
sum1 += (m + 1 - lef + m + 1 - newlef);
sum2 += (m + 1 - rig + m + 1 - newlef);
//cout << i<<"*"<<sum << "*" << minlen <<"*" << newlef <<"*" <<newrig<< endl;
temprig = newlef;
//cout << newlef<<"**"<<newrig<<"*"<<sum1 << "**" <<sum2 << endl;
temprigsum = sum1 < sum2 ? sum1 : sum2;
lefsum = templefsum;
rigsum = temprigsum;
lef = templef;
rig = temprig;
//cout << lefsum <<"*" <<lef<< "*" << rigsum <<"*"<<rig<< endl;
}
//cout << light[0][0]<<light[0][3] << light[1][0] << light[1][3]<<endl;
int sum = lefsum < rigsum ? lefsum : rigsum;
printf("%d\n",sum);
}
return 0;
}
最后,这次比赛还提示出了一点别的小tip,cf的难度理论上是按题号递增的,然而由于各种不可确定因素,导致可做程度并不一定按题号变化的,c题提交数和过题数都远大于b,而惯性思维使得我并没有看c题,e题提交数和过题数都远大于d,使得d基本成防ak的题了,a题hack一片,e题居然是本场比赛正确率最高的题(在交题数量相当可观的情况下),说明只要大胆,任何题都应该去尝试,打破惯性思维,才能有所突破吧。