ccpc2021题解,ccpc长春题解
【独门秘笈】http://acm.uestc.edu.cn/#/problem/show/1215
【题意】水题,题意就是给了两个2*2的矩形,判断通过旋转是否这两个矩形是否相同。
【解题方法】水题。模拟一下,
【交流代码】
#包含位/标准数据h。
使用命名空间标准
typedef long long LL
int main(){
int T;
scanf(%d ,T);
int cas=1;
while(T - ){
printf(Case #%d:,cas);
int a[5],b[5];
for(int I=0;I 4;我)
scanf(%d ,a[I]);
swap(a[2],a[3]);
for(int I=0;I 4;我)
scanf(%d ,b[I]);
swap(b[2],b[3]);
布尔标志=假
for(int I=0;I 4;i ){
if(b[i]==a[0]){
布尔铅=假
for(int j=0;j 4;j ){
if(b[(i j)%4]!=a[j])
线索=真
}
如果(!领导){
标志=真
打破;
}
}
}
if(flag)放(可能);
else puts(不可能);
}
}
【
【赤壁之战】
http://acm.uestc.edu.cn/#/problem/show/1217
【题意】在一个长度为n序列选出m个数,使得这m个数单调递增。
【解题方法】很容易推出数据处理方程dp[i][j]=dp[i][j] dp[k][j-1],a[k] a[i]!但是这个O(n*n*n),不出所料,t了。但是我们仍然很容易想到用少量来优化这个数据处理方程,想到这里大概都知道怎么做了吧。
【交流代码】
//
//由just_sort 2016/9/22 19:47创建
//版权所有(c) 2016 just_sort .版权所有
//
#包含集
#包含地图
#包括队列
#包括堆栈
#包含数学函数
#包括cstdio
#包含标准库函数
#包括字符串
#包括输入输出流
#包含算法
使用命名空间标准
typedef long long LL
const int maxn=1010
const int mod=1e 9 7;
int a[maxn],b[maxn],DP[maxn][maxn];
int n,m;
void add(int x,int y){
x=(x y)% mod;
}
int getsum(int x,int y){
int ans=0;
while(x 0){
add(ans,DP[x][y]);
x-=x-x;
}
返回美国国家标准(American National Standards的缩写)
}
void update(int x,int y,int d){
while(x=n){
add(dp[x][y],d);
x=x-x;
}
}
int main()
{
int T,cas=1;
scanf(%d ,T);
while(T -)
{
memset(dp,0,sizeof(DP));
scanf(%d%d ,n,m);
for(int I=1;I=n;i ){
scanf(%d ,a[I]);
b[I]=a[I];
}
sort(b 1,b n 1);
for(int I=1;I=n;i ){
a[i]=lower_bound(b 1,b n 1,a[I])-b;
}
for(int I=1;I=n;i ){
for(int j=1;j=min(m,I ^ 1);j ){
如果(j==1)更新(a[i],1,1);
否则{
int temp=getsum(a[i]-1,j-1);
update(a[i],j,temp);
}
}
}
int ans=getsum(n,m);
printf(Case #%d: %d\n ,cas,ans);
}
返回0;
}
【
D -挑树枝】
http://acm.uestc.edu.cn/#/problem/show/1218
【题意】要从n根棍子里面选出若干根,放到一个长度为L的水管里面(暂且这么叫了),要求一根水管的重心必须在水管里面。
【解题方法】如果不考虑在外面的水管的话,我们很容易想到这是个裸地背包问题,有了可以放在管子里,我们也可以稍微改变一下得到变形的背包dp。dp[3][i],分别表示没有,有一根,有两根完全放在里面的就行啦。然后套路转移就可以了。
【绝招】特判1,还有为了不出现小数,造成错误,在前面先*2。
【交流代码】
//
//由just_sort 2016/9/22 19:02创建
//版权所有(c) 2016 just_sort .版权所有
//
#包含集
#包含地图
#包括队列
#包括堆栈
#包含数学函数
#包括cstdio
#包含标准库函数
#包括字符串
#包括输入输出流
#包含算法
使用命名空间标准
typedef long long LL
const int maxn=4010
LL DP[3][maxn];
int a[maxn];
LL b[maxn];
int n,L;
int main()
{
int T,cas=1;
scanf(%d ,T);
while(T - ){
scanf(%d%d ,n,L);
LL ans=0;
l *=2;
for(int I=0;I n;i ){
scanf(%d%lld ,a[i],b[I]);
a[I]*=2;
ans=max(ans,b[I]);
}
memset(dp,0,sizeof(DP));
for(int I=0;I n;i ){
for(int j=L;j=a[I]/2;j - ){
dp[1][j]=max(dp[1][j],DP[0][j-a[I]/2]b[I]);
dp[2][j]=max(dp[2][j],DP[1][j-a[I]/2]b[I]);
if(j=a[i]){
dp[0][j]=max(dp[0][j],DP[0][j-a[I]]b[I]);
dp[1][j]=max(dp[1][j],DP[1][j-a[I]]b[I]);
dp[2][j]=max(dp[2][j],DP[2][j-a[I]]b[I]);
}
}
}
ans=max(ans,DP[2][L]);
printf(Case #%d: %lld\n ,cas,ans);
}
返回0;
}
【克-古围棋】http://acm.uestc.edu.cn/#/problem/show/1221
【题意】围棋,判断X棋是否能走一步吃掉某些o棋。满足条件为X棋包含的棋子里面没有。
【解题方法】暴力每一个。棋,把它变成x,然后从四个方向深度搜索,判断一下可行性。
【交流代码】
//
//由just_sort 2016/9/22 20:11创建
//版权所有(c) 2016 just_sort .版权所有
//
#包含集
#包含地图
#包括队列
#包括堆栈
#包含数学函数
#包括cstdio
#包含标准库函数
#包括字符串
#包括输入输出流
#包含算法
使用命名空间标准
typedef long long LL
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0 } };
char s[20][20];
布尔维斯[20][20];
布尔ok
布尔校验(int x,int y)
{
if(x=1 x=9 y=1 y=9)返回真实的
返回错误的
}
void dfs(int x,int y)
{
if(s[x][y]== . ){
ok=1;返回;
}
if(s[x][y]==x )返回;
for(int I=0;I 4;i ){
int tx=x dir[I][0];
int ty=y dir[I][1];
如果(检查(tx,ty)!vis[tx][ty]){
vis[tx][ty]=1;
dfs(tx,ty);
}
}
}
int main()
{
int t,cas=1;
scanf(%d ,t);
while(t - ){
memset(vis,false,sizeof(vis));
for(int I=1;I=9;i ){
scanf(%s ,s[I]1);
}
弯曲件标志=0;
for(int I=1;I=9;i ){
for(int j=1;j=9;j ){
if(s[i][j]== . ){
s[I][j]= x ;
for(int k=0;k4;k ){
int tx=I dir[k][0];
int ty=j dir[k][1];
if(check(tx,ty) s[tx][ty]==o){
memset(vis,false,sizeof(vis));
vis[tx][ty]=1;
ok=0;
dfs(tx,ty);
if(ok==0)flag=1;
}
}
s[i][j]= .
}
如果(标志)断开;
}
如果(标志)断开;
}
如果(标志){
printf(案例号%d:可以一招毙命!\n ,cas);
}否则{
printf(案例号%d:不能一招毙命!\n ,cas);
}
}
返回0;
}
【
H -数独】
http://acm.uestc.edu.cn/#/problem/show/1222
【题意】就是求解一个4*4的数独问题。
【解题方法1】搜索
【解题方法2】套尊贵型模板,我个智障。
【交流代码】
//
//由just_sort 2016/9/21 13:02创建
//版权所有(c) 2016 just_sort .版权所有
//
#包含集
#包含地图
#包括队列
#包括堆栈
#包含数学函数
#包括cstdio
#包含标准库函数
#包括字符串
#包括输入输出流
#包含算法
使用命名空间标准
typedef long long LL
const int maxnode=100010 * 2;
const int maxm=1010
const int maxn=1010 * 4;
结构DLX{
整数,m,大小
int U[maxnode],D[maxnode],L[maxnode],R[maxnode],Row[maxnode],Col[maxnode];
//U D R L用来记录某个标号的节点的上下左右节点的编号
//行列用来记录某个标号的节点在矩阵中的行号和列号
int H[maxn],S[maxm];
//H是行头,S用来保存某一列中一的数量
int ansd,ans[maxn];
void init(int _n,int _m)
{
n=_n,m=_ m
//初始化列头
for(int I=0;I=m;i ){
s[I]=0;
u[I]=D[I]=I;
L[i]=i-1,R[I]=I 1;
}
R[m]=0,L[0]=m;
尺寸=m;
for(int I=1;I=n;I)H[I]=-1;
}
无效链接(整数r,整数c)
{
s[Col[size]=c];
row[size]=r;
D[size]=D[c];
u[D[c]]=size;
u[size]=c;
d[c]=大小;
if(H[r] 0){
h[R]=L[size]=R[size]=size;
}否则{
R[size]=R[H[R]];
l[R[H[R]]=size;
l[size]=H[r];
r[H[r]]=size;
}
}
//对某一列进行删除,并删除列中为一的行
无效删除(int c)
{
L[R[c]]=L[c];R[L[c]]=R[c];
for(int I=D[c];我!=c;i=D[i])
for(int j=R[I];j!=I;j=R[j]){
U[D[j]]=U[j];
D[U[j]]=D[j];
-S[Col[j]];
}
}
//反着恢复状态
无效简历(内部)
{
for(int I=U[c];我!=c;i=U[i])
for(int j=L[I];j!=I;j=L[j]){
U[D[j]]=D[U[j]]=j;
s[Col[j]];
}
L[R[c]]=R[L[c]]=c;
}
//d为递归深度
布尔舞(国际d)
{
if(R[0]==0){
ansd=d;
返回真实的
}
int c=R[0];
//一个优化找到列中包含一最多的列因为这样有助于减少递归深度(很显然一多了删掉的行也多矩阵缩小得就快)
for(int I=R[0];我!=0;i=R[i]){
if(S[i] S[c])
c=I;
}
删除(c)和:
//搜索
for(int I=D[c];我!=c;i=D[i]){
ans[d]=Row[I];
for(int j=R[I];j!=I;j=R[j])remove(Col[j]);
if(舞蹈(d 1))返回真实的
for(int j=L[I];j!=I;j=L[j])简历(Col[j]);
}
简历(c)和:
返回错误的
}
} dlx
char s[100];
充电温度[10];
int main()
{
int T,cas=1;
scanf(%d ,T);
while(T -)
{
memset(s,0,sizeof(s));
int CNT=0;
for(int I=0;I 4;i ){
scanf(%s ,temp);
for(int j=0;j(int)strlen(temp);j ){
s[CNT]=temp[j];
}
}
s[CNT]= \ 0 ;
dlx.init(16*9,16 * 4);
for(int I=0;I 4;i ){
for(int j=0;j 4;j ){
int x=i,y=j,z=x/2 * 2y/2;
int w=I * 4j
if(s[w]==*){
for(int k=1;k=4;k ){
dlx .Link(w*4 k,w 1);
dlx .Link(w*4 k,16x * 4k);
dlx .链接(w*4 k,32y * 4k);
dlx .链接(w*4 k,48z * 4k);
}
}
否则{
int t=s[w]- 0 ;
dlx .Link(w*4 t,w 1);
dlx .链接(w*4 t,16 x * 4t);
dlx .链接(w*4 t,32y * 4t);
dlx .链接(w*4 t,48z * 4t);
}
}
}
dlx。舞蹈(0);
for(int I=0;i dlx.ansdi ){
int t=dlx。ans[I];
int a=(t-1)/4,b=(t-1)% 4 1 ;
s[a/4 * 4a % 4]=b;
}
printf(Case #%d:\n ,cas);
int len=strlen(s);
for(int I=0;我leni ){
printf(%c ,s[I]);
如果(i==0)继续;
if((I ^ 1)% 4==0)puts();
}
}
返回0;
}
【
我-华佗的药】
http://acm.uestc.edu.cn/#/problem/show/1226
【题意】水题,输出2个n-1即可。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。