1.24日学习总结

今天补了测试中的两个题目。题目如下。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA57uI56m26L-Y5piv5LiA5Lq654us6KGM,size_17,color_FFFFFF,t_70,g_se,x_16这道题在测试中花了很多时间,我感觉绝大多数原因都是没看懂题目。 特别是题目中很明显的标志了。可以各使用n次,总数是2n。这加起来,不就是可以改2n次吗? 我每个选项都把它改成。A胜利就行了。。。。所以我当时真的挺无语的。代码如下。

#include<stdio.h>int a[1000000],b[1000000];int main(){    int t;    scanf("%d",&t);    for(int s=0;s<t;s++){        int n;        scanf("%d",&n);        for(int i=1;i<=2*n;i++){ scanf("%d",&a[i]);}        for(int i=1;i<=2*n;i++) {         scanf("%d",&b[i]);}        for(int i=1;i<=n;i++){             if(b[i]==1) a[i]=3;            if(b[i]==2) a[i]=1;            if(b[i]==3) a[i]=2;        }        for(int i=n+1;i<=2*n;i++){             if(a[i]==1) b[i]=2;            if(a[i]==2) b[i]=3;            if(a[i]==3) b[i]=1;        }        printf("%d
",2*n);         for(int i=1;i<=2*n;i++){ printf("%d ",a[i]);} printf("
");        for(int i=1;i<=2*n;i++) { printf("%d ",b[i]);}        printf("
");    }    return 0;}

还有另外一题跟这个题几乎一样。但是他改了很恶心的一点。就是他必须要使用n次也就是每a,b都必须要改n次。 但是有些情况a是不需要改的。 因为有的情况可以,本来就是胜利的。 所以这种情况就会导致如果我们按上述方法来改的话。除非a全输了。不然的话肯定不可能恰好使用n次。

所以我就进行了一个标记。首先我是采用了一个计数器。 来保证改a和改b。是交替进行的。这样的话是为了确保最后多出来的。对a对b的操作次数不会相差太大。还要进行一个标记。标记这个原组合是a赢了还是a输了? 这个目的是为了在接下来。使用掉那些多出来的操作。 因为如果a赢了,我们就不进行更改。这样的话,我们使用多余的操作。也就是把他们换一种组合,就相当于消耗了两次机会。改a改b各一次。 当然得到的数肯定不会刚好是偶数。 这样的话。就需要改,我们原本改过的数,这样的话,就相当于改一次。 这里要注意的就是 改过后的组合。只需要和没改之前的,不一样就行。这样就相当于只改一次。然后这里其实还有一个小细节。因为如果剩下的次数不是偶数。那么一定会多用一次改a,就是说一定会少改一次b, 这样的话。我们只需要找到我们第一个改a的组合。再改一次,就相当于用掉一次改b的机会。所以我的代码中,只有改正b的次数

小于n的判断。 虽然也没几个人看我的代码。但我还是想说明一下。

具体代码如下,

  #include<stdio.h> int t,n,a[100000000],b[100000000],c[10000000],d[100000000];  int  judge(int x,int y){ if(x==1&&y==2)return 1; if(x==2&&y==3)return 1; if(x==3&&y==1)return 1; return 0; }  int vis[100000000]; int main(){ scanf("%d",&t);  for(int s=0;s<t;s++){ scanf("%d",&n); int T=0,a1=0,b1=0; for(int i=1;i<=n*2;i++){ scanf("%d",&a[i]); c[i]=a[i]; vis[i]=0; } for(int i=1;i<=n*2;i++){ scanf("%d",&b[i]); d[i]=b[i]; } for(int i=1;i<=2*n;i++){ if(judge(a[i],b[i])==0) { T++; if(T%2!=0){ a1++; c[i]=d[i]-1; if(c[i]==0)c[i]=3; }  else{ b1++; d[i]=c[i]+1; if(d[i]==4)d[i]=1; }  vis[i]=1; }}  for(int i=1;i<=2*n;i++){ if(vis[i]==0){  if(a1<n&&b1<n){ c[i]+=1; d[i]+=1; if(c[i]==4)c[i]=1; if(d[i]==4)d[i]=1; a1++,b1++; } if(a1==b1&&a1==n)break; }}  if(b1<n){ for(int i=1;i<=n*2;i++){ if(vis[i]==1){ for(int j=1;j<=3;j++){ for(int k=1;k<=3;k++) if(j!=a[i]&&k!=b[i]&&judge(j,k)==1){c[i]=j; d[i]=k;} }  break; } } }   printf("%d
",2*n); for(int i=1;i<=n*2;i++){ printf("%d ",c[i]); }printf("
"); for(int i=1;i<=n*2;i++) { printf("%d ",d[i]); }printf("
"); } return 0; }

好啦,今天的学习总结就写到这里了,祝大家新年快乐。新的一年都能做成自己想做的事。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值