ccpc2021题解,ccpc长春题解

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • office2010激活密钥大全 怎么永久激活office2010
  • project2010产品密钥免费_project2010激活密钥永久激活码
  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • chatgpt是什么?为什么这么火?
  • ChatGPT为什么注册不了?OpenAI ChatGPT的账号哪里可以注册?
  • OpenAI ChatGPT怎么注册账号?ChatGPT账号注册教程
  • chatgpt什么意思,什么是ChatGPT ?
  • CAD中怎么复制图形标注尺寸不变,CAD中怎么复制图形线性不变
  • cad中怎么创建并使用脚本文件,cad怎么运行脚本
  • cad中快速计算器的功能,cad怎么快速计算
  • cad中快速修改单位的方法有哪些,cad中快速修改单位的方法是
  • cad中心点画椭圆怎么做,cad轴测图怎么画椭圆
  • CAD中常用的快捷键,cad各种快捷键的用法
  • 留言与评论(共有 条评论)
       
    验证码: