zoukankan      html  css  js  c++  java
  • 2018SCin tsyzDay1 模拟赛-模拟

    预计得分:70+0+0+100+100+100+100=470

    实际得分:70+0+0+30+100+0+40=240

    第一天就被模拟虐爆qwq

    T1

    https://www.luogu.org/problemnew/show/P1205

    因为是找最小的,所以分别把每个操作改变后的数和要求矩阵中的数比较即可。

    找到合适的退出即可。

    每个操作中都有一些细节,不难,慢慢推就可推出。

    §  在luogu上测的时候因为是linux系统,故用getchar崩了,noip时切忌用getchar,防止出现意外。

    §  函数也能传二维数组,只是要声明清楚第二维的范围,如void change(char s1[][10]),所以还是不传的好,防止出现意外。

    code

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<iostream> 
      4 #include<algorithm>
      5 
      6 using namespace std;
      7 int n;
      8 bool flag;
      9 char a[15][15],b[15][15],c[15][15];
     10 void read()
     11 {
     12     for(int i=1;i<=n;i++)
     13      for(int j=1;j<=n;j++)
     14       cin>>a[i][j];
     15     for(int i=1;i<=n;i++)
     16      for(int j=1;j<=n;j++)
     17       cin>>b[i][j];
     18 }
     19 void doit1()
     20 {
     21     for(int j=1;j<=n;j++)
     22      for(int i=n;i>=1;i--)
     23      {
     24           if(a[i][j]!=b[j][n-i+1])
     25           {
     26               flag=false;
     27               break;
     28          } 
     29      }
     30 }
     31 void doit2()
     32 {
     33     for(int i=n;i>=1;i--)
     34       for(int j=n;j>=1;j--)
     35       {
     36             if(a[i][j]!=b[n-i+1][n-j+1])
     37             {
     38              flag=false;
     39              break;                
     40           }
     41       }
     42 }
     43 void doit3()
     44 {
     45     for(int j=n;j>=1;j--)
     46       for(int i=1;i<=n;i++)
     47       {
     48            if(a[i][j]!=b[n-j+1][i])
     49            {
     50                   flag=false;
     51                   break;
     52            }
     53       }
     54 }
     55 void doit51()
     56 {
     57     for(int j=1;j<=n;j++)
     58      for(int i=n;i>=1;i--)
     59      {
     60           if(c[i][j]!=b[j][n-i+1])
     61           {
     62               flag=false;
     63               break;
     64          } 
     65      }
     66 } 
     67 void doit52()
     68 {
     69     for(int i=n;i>=1;i--)
     70       for(int j=n;j>=1;j--)
     71       {
     72             if(c[i][j]!=b[n-i+1][n-j+1])
     73             {
     74              flag=false;
     75              break;                
     76           }
     77       }
     78 }
     79 void doit53()
     80 {
     81     for(int j=n;j>=1;j--)
     82       for(int i=1;i<=n;i++)
     83       {
     84            if(c[i][j]!=b[n-j+1][i])
     85            {
     86                   flag=false;
     87                   break;
     88            }
     89       }
     90 }
     91 int main()
     92 {
     93      //freopen("transform.in","r",stdin);
     94      //freopen("transform.out","w",stdout);
     95      scanf("%d",&n);
     96      read();
     97      
     98      flag=true;
     99      doit1();
    100      if(flag)
    101      {
    102          printf("1");
    103          return 0;
    104      }
    105      
    106      flag=true;
    107      doit2();
    108      if(flag)
    109      {
    110         printf("2");
    111         return 0;
    112      }
    113      
    114      flag=true;
    115      doit3();
    116       if(flag)
    117       {
    118            printf("3");
    119            return 0;
    120       }
    121       
    122       flag=true;
    123       for(int i=1;i<=n;i++)
    124        for(int j=1;j<=n;j++)
    125         {
    126             if(b[i][j]!=a[i][n-j+1])
    127             {
    128                 flag=false;
    129                 break;
    130             }
    131         }
    132       if(flag)
    133       {
    134             printf("4");
    135             return 0;
    136       }
    137       
    138       flag=true;
    139       for(int i=1;i<=n;i++)
    140        for(int j=1;j<=n;j++)
    141         c[i][j]=a[i][n-j+1];
    142       doit51();
    143       if(flag)
    144       {
    145            printf("5");
    146            return 0;
    147       }
    148       flag=true;
    149       doit52();
    150       if(flag)
    151       {
    152            printf("5");
    153            return 0;
    154       }
    155       flag=true;
    156       doit53();
    157       if(flag)
    158       {
    159            printf("5");
    160            return 0;
    161       }
    162       
    163       flag=true;
    164       for(int i=1;i<=n;i++)
    165        for(int j=1;j<=n;j++)
    166         {
    167             if(a[i][j]!=b[i][j])
    168             {
    169                 flag=false;
    170                 break;
    171             }
    172          }
    173        if(flag)
    174        {
    175             printf("6");
    176             return 0;
    177        }
    178        printf("7");
    179        fclose(stdin);
    180        fclose(stdout);
    181        return 0;
    182 }
    View Code

    T2

    轮换的顺序是从右到左。

    开始测试的时候乘积没有看懂,果断放弃这题....

    T3

    https://www.luogu.org/problemnew/show/P1459

    这道题三月份做过,今天忘的很惨...故一定要把做过的题随时做都能对!

    从这题我们可以得出,分析问题可以分类它有限的情况----

    排好序后一定分为三个区间,那么错排的数只有这几种情况:

    1  在区间2中出现了数字1,而数字2到了区间1

    2  在区间3中出现了数字1,而数字3到了区间1

    3  在区间3中出现了数字2,而数字2到了区间3

    4  一个数字1跑到了区间2,同时区间2中的一个数字2跑到了区间3,区间3中的一个数字3跑到了区间1

    5  一个数字1跑到了区间3,同时区间3中的一个数字3跑到了区间2,区间2中的一个数字2跑到了区间1

    其中,前三种情况进行改变只需要操作1次,而后两种操作进行改变需要2次。

    那么我们可以贪心地先尽量搞前三种操作,最后在解决后两种操作。

    在解决前三种操作后,大体的顺序已经出来了,只剩几个毒瘤没有回家的数。实质上我们把三个数作为一组,改变每一组需要两次操作。

    code

     1 #include<cstdio>
     2 #include<algorithm>
     3 
     4 using namespace std;
     5 int n,ans,tmp,o,p,q;
     6 int a[2000];
     7 
     8 int main()
     9 {
    10     freopen("sort.in","r",stdin);
    11     freopen("sort.out","w",stdout);
    12     scanf("%d",&n);
    13     for(int i=1;i<=n;i++)
    14     {
    15         scanf("%d",&a[i]);
    16         if(a[i]==1) o++;
    17         if(a[i]==2) p++;
    18     } 
    19     p=p+o; 
    20     for(int i=1;i<=o;i++)
    21     {
    22         if(a[i]!=2) continue;
    23         for(int j=o+1;j<=p;j++)
    24             if(a[j]==1)
    25             {
    26                 ans++;
    27                 swap(a[i],a[j]);
    28                 break;
    29             } 
    30     }
    31     for(int i=1;i<=o;i++)
    32     {
    33         if(a[i]!=3) continue;
    34         for(int j=p+1;j<=n;j++)
    35             if(a[j]==1) 
    36             {
    37                 ans++;
    38                 swap(a[i],a[j]);
    39                 break;
    40             }
    41     }
    42     for(int i=o+1;i<=p;i++)
    43     {
    44         if(a[i]!=3) continue;
    45         for(int j=p+1;j<=n;j++)
    46             if(a[j]==2)
    47             {
    48                 ans++;
    49                 swap(a[i],a[j]);
    50                 break;
    51             } 
    52     }
    53     for(int i=1;i<=o;i++) if(a[i]!=1) tmp++;
    54     for(int i=o+1;i<=p;i++) if(a[i]!=2) tmp++;
    55     for(int i=p+1;i<=n;i++) if(a[i]!=3) tmp++;
    56     ans+=tmp*2/3;
    57     printf("%d",ans);
    58     fclose(stdin);
    59     fclose(stdout);
    60     return 0;
    61 } 
    View Code

    §  o,p是记录为1的数有几个、为2的数有几个的变量,实际应用时我们却把它看成了区间上的点。因此使用时先让p+=o;

    §  进行前三次操作时,找到一个就break即可。

    T4

    极水。但是没开long long 。。。。。。

    没开long long。。。。。

    long long。。。。。。

    code

     1 #include<cstdio>
     2 #include<algorithm>
     3 
     4 using namespace std;
     5 
     6 long long n,ans;
     7 long long a[250000];
     8 int main()
     9 {
    10     freopen("simple.in","r",stdin);
    11     freopen("simple.out","w",stdout);
    12     scanf("%d",&n);
    13     for(int i=1;i<=2*n;i++)
    14      scanf("%lld",&a[i]);
    15     sort(a+1,a+2*n+1);
    16     for(int i=1;i<=2*n;i+=2)
    17      ans+=a[i];
    18     printf("%lld",ans);
    19     fclose(stdin);
    20     fclose(stdout);
    21     return 0;
    22 }
    View Code

    T5

    做的第一题,极水,但要考虑交20元时,有找3个5元或1个5元1个10元的情况。

    code

     1 #include<cstdio>
     2 #include<algorithm>
     3 
     4 using namespace std;
     5 
     6 int n;
     7 int t1,t2;
     8 bool flag;
     9 
    10 int main()
    11 {
    12     freopen("book.in","r",stdin);
    13     freopen("book.out","w",stdout);
    14     scanf("%d",&n);
    15     flag=true;
    16     for(int i=1;i<=n;i++)
    17     {
    18         int x=0;
    19         scanf("%d",&x);
    20         if(flag)
    21         {
    22             if(x==5) t1++;
    23             if(x==10)
    24              if(t1) t2++,t1--;
    25              else flag=false;
    26             if(x==20)
    27              if(t1&&t2) t2--,t1--;
    28              else if(t1>=3) t1-=3;
    29              else flag=false;
    30         }
    31     }
    32     if(flag) printf("YES");
    33     else printf("NO");
    34     fclose(stdin);
    35     fclose(stdout);
    36     return 0;
    37 }
    View Code

    T6

    没用到hash表/map,用的结构体。思路对,但是实现复杂,所以错了。而且空间开小了。

    code

     1 #include<cstdio>
     2 #include<algorithm>
     3 
     4 using namespace std;
     5 int n,tot,ans=0x3f3f3f3f,tmp,f;
     6 struct node{
     7     int val;//num没有必要 
     8     bool flag;
     9 }a[700000];
    10 //开2倍 
    11 bool cmp(node p,node q)
    12 {
    13      return p.val<q.val;
    14 }
    15 
    16 int main()
    17 {
    18     freopen("card.in","r",stdin);
    19     freopen("card.out","w",stdout);
    20     scanf("%d",&n);
    21     for(int i=1;i<=n;i++)
    22     {
    23         int ai=0,bi=0;
    24         scanf("%d%d",&ai,&bi);
    25         if(ai==bi)
    26         {
    27             a[++tot].val=ai,a[tot].flag=0;
    28         }
    29         else a[++tot].val=ai,a[tot].flag=0,a[++tot].val=bi,a[tot].flag=1;
    30     }
    31     sort(a+1,a+tot+1,cmp);
    32 /*    for(int i=1;i<=tot;i++) printf("%d ",a[i].val);printf("
    ");
    33     for(int i=1;i<=tot;i++) printf("%d ",a[i].num);           */ 
    34     for(int i=1;i<=tot;i++)
    35     {
    36         tmp++;
    37         if(a[i].flag==0) f++;//两个量每次先记录。 
    38         if(a[i].val!=a[i+1].val)
    39         {
    40             if(tmp>=(n+1)/2) 
    41             {
    42                 int d=((n+1)/2-f);//减去正面的,就是需要翻的。 
    43                 if(d<0) d=0;
    44                 ans=min(ans,d);
    45             }
    46             tmp=0,f=0;
    47         }
    48     }
    49     if(ans==0x3f3f3f3f) 
    50     {
    51         printf("Impossible");
    52         return 0;
    53     }
    54     printf("%d",ans);
    55     fclose(stdin);
    56     fclose(stdout);
    57     return 0;
    58 }
    View Code

    T7

    我4月份的时候写了这题的题解!!!!

    https://www.luogu.org/problemnew/solution/P3056

     -------然而还是忘了。

    code

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<stack>
     5 
     6 using namespace std;
     7 
     8 int len,l,r,ans;
     9 char ch[200000];
    10 stack<char>s;
    11 
    12 int main()
    13 {
    14     freopen("shower.in","r",stdin);
    15     freopen("shower.out","w",stdout);
    16     scanf("%s",ch+1);
    17     int len=strlen(ch+1);
    18     for(int i=1;i<=len;i++)
    19     {
    20         if(ch[i]=='(') s.push(ch[i]);
    21         if(ch[i]==')') 
    22         {
    23             if(!s.empty())
    24                 s.pop();
    25             else s.push('('),r++;
    26         } 
    27     }
    28     ans=r+s.size()/2; 
    29     printf("%d",ans);
    30     fclose(stdin);
    31     fclose(stdout);
    32     return 0;
    33 }
    View Code
  • 相关阅读:
    2017-2018-1 20155306 《信息安全系统设计基础》第11周学习总结
    2017-2018-1 20155306 实验三 实时系统
    2017-2018-1 20155306 《信息安全系统设计基础》第9周学习总结
    2017-2018-1 20155306 mypwd的实现
    2017-2018-1 20155306 《信息安全系统设计基础》第8周课上测试+课下实践
    2017-2018-1 20155306 《信息安全系统设计基础》第8周学习总结
    2017-2018-1 20155306 《信息安全系统设计基础》第7周学习总结
    20155212——man指令的使用及mypwd的实现
    2017-2018-1 20155213 《信息安全系统设计基础》第七周学习总结
    2017-2018-1 20155213 20155303 实验二 固件程序设计
  • 原文地址:https://www.cnblogs.com/nopartyfoucaodong/p/9307535.html
Copyright © 2011-2022 走看看