Contest地址(VJ) 点击打开链接
好气啊啊啊!!!C题简直神TM坑!!!
Problem A (HDU 1050)
区间覆盖最小,也叫最小工人问题. 需要注意的是门牌号需要处理一下(对门归为一个门牌号)
参见 区间调度问题详解
Problem B (POJ 1125)
做过。Floyd算法的题目。题解 POJ 1125 Floyd最短路入门
Problem C (POJ 1176)
沃日啊!我最后做的这道题!我TM以为这道题非常困难呢,一直在找规律,6个分一组然后判断一共有8种状态!然而,这是一道DFS就能过的题!
来来来,贴一下累得半死的找规律...(俩小时) 最关键的是居然WA !
/// POJ 1176
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
#define MAXN 150
/// 按照6个一组进行分组,每一组只能有以下8种状态
/**
A 000000
B 101010 (1)
C 010101 (1)
D 010010 (1)
E 111111 (B^C) (2)
F 111000 (B^D) (2)
G 000111 (C^D) (2)
H 101101 (B^C^D) (3)
*/
int abit[MAXN];
int c_abit=0;
int bbit[MAXN];
int c_bbit=0;
int status_map[8][6]
{
{
1,1,1,1,1,1 ///A 0
},
{
0,1,0,1,0,1 ///B 1
},
{
1,0,1,0,1,0 ///C 1
},
{
0,1,1,0,1,1 ///D 1
},
{
1,0,0,1,0,0 ///E 2
},
{
0,0,1,1,1,0 ///F 2
},
{
1,1,0,0,0,1 ///G 2
},
{
0,0,0,0,0,0 ///H 3
}
};
int exclude_lable[8];
int bit_bucket[6];
int main()
{
/// Input Start
int N;
scanf("%d",&N);
int C;
scanf("%d",&C);
C=C%3;
int tmp;
while(scanf("%d",&tmp)==1&&tmp!=-1) abit[c_abit++]=tmp%6;
while(scanf("%d",&tmp)==1&&tmp!=-1) abit[c_bbit++]=tmp%6;
/// Input Finish.
for(int i=0;i<8;i++)/// Search in 8 Status
{
for(int j=0;j<c_abit;j++)
{
if(status_map[i][abit[j]]!=1) /// Must Be ON
{
exclude_lable[i]=1;
}
}
for(int j=0;j<c_bbit;j++)
{
if(status_map[i][bbit[j]]!=0) /// Must Be OFF
{
exclude_lable[i]=1;
}
}
}
/// Now status not excluded might be answers.
/// Check C and confirm them
for(int i=0;i<8;i++)
{
if(!exclude_lable[i])
{
/// Not excluded.
switch(i)
{
/// case 0 is not checked.
case 1:case 2:case 3: {if(C!=1) exclude_lable[i]=1;}break;
case 4:case 5:case 6: {if(C!=2) exclude_lable[i]=1;}break;
}
}
}
/// Now status are confirmed.
/// But if N%6 != 0 then you should check if repetitions exist.
/// But N >= 10 > 6 , so check is needn't.
vector<string> ans;
/// Output
for(int i=0;i<8;i++)
{
if(!exclude_lable[i])
{
string t;
switch(i)
{
case 0:
{
char p[]="111111";
for(int c=0;c<N/6;c++) t+=p;
p[N%6]=0;
t+=p;
}
case 1:
{
char p[]="010101";
for(int c=0;c<N/6;c++) t+=p;
p[N%6]=0;
t+=p;
}
break;
case 2:
{
char p[]="101010";
for(int c=0;c<N/6;c++) t+=p;
p[N%6]=0;
t+=p;
}
break;
case 3:
{
char p[]="011011";
for(int c=0;c<N/6;c++) t+=p;
p[N%6]=0;
t+=p;
}
break;
case 4:
{
char p[]="100100";
for(int c=0;c<N/6;c++) t+=p;
p[N%6]=0;
t+=p;
}
break;
case 5:
{
char p[]="001110";
for(int c=0;c<N/6;c++) t+=p;
p[N%6]=0;
t+=p;
}
break;
case 6:
{
char p[]="110001";
for(int c=0;c<N/6;c++) t+=p;
p[N%6]=0;
t+=p;
}
break;
case 7:
{
char p[]="000000";
for(int c=0;c<N/6;c++) t+=p;
p[N%6]=0;
t+=p;
}
break;
}
ans.push_back(t);
}
}
sort(ans.begin(),ans.end());
for(size_t i=0;i<ans.size();i++)
{
printf("%s\n",ans.at(i).c_str());
}
return 0;
}
Problem D (POJ 3667)
线段树。写了份新的模板。
线段树模板集合(持续更新)
SegmentTree Template On GitHub