华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2864|回复: 17
打印 上一主题 下一主题

刘伟杰李香来程序大楼

[复制链接]

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
跳转到指定楼层
楼主
发表于 2018-10-16 19:03:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是刘,李两位同学的程序暂存大楼,他们的程序写在这里,自己欣赏
回复

使用道具 举报

23

主题

38

帖子

127

积分

华一学生

积分
127
沙发
发表于 2018-10-16 21:04:16 | 只看该作者
本帖最后由 刘伟杰 于 2018-10-16 21:07 编辑

luogu p1095 守望者的逃离 水题

思路:dp+贪心

AC代码:
  1. #include <bits/stdc++.h>

  2. using namespace std;

  3. int dp[15000000];
  4. int m,s,t;


  5. int main()
  6. {
  7.    scanf("%d%d%d",&m,&s,&t);
  8.    int i;
  9.    for(i = 1;i <= t;i++)
  10.    {
  11.        if(m >= 10)
  12.        {
  13.            m -= 10;
  14.            dp[i] = dp[i-1] + 60;
  15.        }else
  16.        {
  17.            m+=4;
  18.            dp[i] = dp[i-1];
  19.        }
  20.    }
  21.    for(i = 1;i <= t;i++)
  22.    {
  23.        dp[i] = max(dp[i-1]+17,dp[i]);
  24.        if(dp[i] >= s)
  25.        {
  26.            printf("Yes\n%d",i);
  27.            return 0;
  28.        }
  29.    }
  30.    printf("No\n%d",dp[t]);

  31.     return 0;
  32. }
复制代码


回复 支持 反对

使用道具 举报

23

主题

38

帖子

127

积分

华一学生

积分
127
板凳
发表于 2018-10-16 21:06:14 | 只看该作者
luogu p1098 字符串展开 模拟

特判比较多

AC代码
  1. #include <bits/stdc++.h>

  2. using namespace std;

  3. char a[100000];
  4. int p1,p2,p3;
  5. char bg;
  6. char ed;
  7. int main()
  8. {

  9.     scanf("%d%d%d",&p1,&p2,&p3);
  10.     scanf("%s",a);
  11.     int len = strlen(a);
  12.     for(int i = 0;i < len;i++)
  13.     {
  14.         if(a[i] != '-')
  15.         {
  16.             printf("%c",a[i]);
  17.         }else
  18.         {
  19.             if(a[i-1] == '-')
  20.             {
  21.                 printf("-");
  22.                 continue;
  23.             }
  24.             if(a[i-1] >= a[i+1])
  25.             {
  26.                 printf("-");
  27.                 continue;
  28.             }
  29.             if(a[i+1] - a[i-1]> 27)
  30.             {
  31.                 printf("-");
  32.                 continue;
  33.             }
  34.             if(a[i+1] - a[i-1] == 1)  continue;
  35.             if(p1 == 1)
  36.             {
  37.                 if(p3 == 2)
  38.                 {
  39.                    ed = a[i-1] + 1;
  40.                    bg = a[i+1] - 1;
  41.                    for(int j = bg;j >= ed;j--)
  42.                    {
  43.                        char z = j;
  44.                        for(int k = 1;k <= p2;k++)
  45.                        {
  46.                            printf("%c",z);
  47.                        }
  48.                    }
  49.                 }else
  50.                 {
  51.                    bg = a[i-1] + 1;
  52.                    ed = a[i+1] - 1;
  53.                    for(int j = bg;j <= ed;j++)
  54.                    {
  55.                        char z = j;
  56.                        for(int k = 1;k <= p2;k++)
  57.                        {
  58.                            printf("%c",z);
  59.                        }
  60.                    }
  61.                 }
  62.             }
  63.             if(p1 == 3)
  64.             {
  65.                 if(p3 == 2)
  66.                 {
  67.                    ed = a[i-1] + 1;
  68.                    bg = a[i+1] - 1;
  69.                    for(int j = bg;j >= ed;j--)
  70.                    {
  71.                        for(int k = 1;k <= p2;k++)
  72.                        {
  73.                            printf("*");
  74.                        }
  75.                    }
  76.                 }else
  77.                 {
  78.                    bg = a[i-1] + 1;
  79.                    ed = a[i+1] - 1;
  80.                    for(int j = bg;j <= ed;j++)
  81.                    {
  82.                        for(int k = 1;k <= p2;k++)
  83.                        {
  84.                            printf("*");
  85.                        }
  86.                    }
  87.                 }
  88.             }
  89.             if(p1 == 2)
  90.             {
  91.                 if(p3 == 2)
  92.                 {
  93.                    ed = a[i-1] + 1;
  94.                    bg = a[i+1] - 1;
  95.                    for(int j = bg;j >= ed;j--)
  96.                    {
  97.                        char z = j;
  98.                        if(z > 96)
  99.                        {
  100.                            z = z - 32;
  101.                        }
  102.                        for(int k = 1;k <= p2;k++)
  103.                        {
  104.                            printf("%c",z);
  105.                        }
  106.                    }
  107.                 }else
  108.                 {
  109.                    bg = a[i-1] + 1;
  110.                    ed = a[i+1] - 1;
  111.                    for(int j = bg;j <= ed;j++)
  112.                    {
  113.                        char z = j;
  114.                        if(z > 96)
  115.                        {
  116.                            z = z - 32;
  117.                        }
  118.                        for(int k = 1;k <= p2;k++)
  119.                        {
  120.                            printf("%c",z);
  121.                        }
  122.                    }
  123.                 }
  124.             }
  125.         }
  126.     }

  127.     return 0;
  128. }
复制代码


回复 支持 反对

使用道具 举报

23

主题

38

帖子

127

积分

华一学生

积分
127
地板
发表于 2018-10-16 21:19:47 | 只看该作者
luogu UVA253 cube painting
穷举 可以用到数学思想:不管骰子怎么转动,相对的两面不变。

穷举AC代码:
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int dir[6][6] = { { 0, 1, 2, 3, 4, 5 }, { 1, 0, 3, 2, 5, 4 }, { 2, 0, 1, 4, 5, 3 }, { 3, 0, 4, 1, 5, 2 }, { 4, 0, 2, 3, 5, 1 }, { 5, 1, 3, 2, 4, 0 } };
  4. char a[10],b[10],s[20];
  5. bool judge()
  6. {
  7.     for (int i=0; i<6; i++)
  8.     {
  9.         char temp[10]="";
  10.         for (int j=0; j<6; j++)
  11.             temp[j]=a[dir[i][j]];
  12.         for (int j=0; j<4; j++)
  13.         {
  14.             char c_temp;
  15.             c_temp=temp[1];
  16.             temp[1]=temp[2];
  17.             temp[2]=temp[4];
  18.             temp[4]=temp[3];
  19.             temp[3]=c_temp;
  20.             if (strcmp(temp,b)==0) return true;
  21.         }
  22.     }
  23.     return false;
  24. }
  25. int main()
  26. {
  27.     while (scanf("%s",s)!=EOF)
  28.     {
  29.         for (int i=0; i<6; i++)
  30.             a[i]=s[i];
  31.         a[6]=0;
  32.         for (int i=0; i<6; i++)
  33.             b[i]=s[i+6];
  34.         b[6]=0;
  35.         if (judge()) printf("TRUE\n");
  36.         else printf("FALSE\n");
  37.     }
  38. }
复制代码

回复 支持 反对

使用道具 举报

23

主题

38

帖子

127

积分

华一学生

积分
127
5#
发表于 2018-10-16 21:26:24 | 只看该作者
luogu p1598 垂直柱状图   
过水,注意输出
模拟
AC代码:
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. string k[10];
  4. int m;
  5. int len[5];
  6. int counts[27];
  7. int ans;
  8. void f(int x)
  9. {
  10.     int i;
  11.     for(i = 0; i < len[x]; i++)
  12.     {
  13.         if(k[x][i] == 'A') counts[1]++;
  14.         if(k[x][i] == 'B') counts[2]++;
  15.         if(k[x][i] == 'C') counts[3]++;
  16.         if(k[x][i] == 'D') counts[4]++;
  17.         if(k[x][i] == 'E') counts[5]++;
  18.         if(k[x][i] == 'F') counts[6]++;
  19.         if(k[x][i] == 'G') counts[7]++;
  20.         if(k[x][i] == 'H') counts[8]++;
  21.         if(k[x][i] == 'I') counts[9]++;
  22.         if(k[x][i] == 'J') counts[10]++;
  23.         if(k[x][i] == 'K') counts[11]++;
  24.         if(k[x][i] == 'L') counts[12]++;
  25.         if(k[x][i] == 'M') counts[13]++;
  26.         if(k[x][i] == 'N') counts[14]++;
  27.         if(k[x][i] == 'O') counts[15]++;
  28.         if(k[x][i] == 'P') counts[16]++;
  29.         if(k[x][i] == 'Q') counts[17]++;
  30.         if(k[x][i] == 'R') counts[18]++;
  31.         if(k[x][i] == 'S') counts[19]++;
  32.         if(k[x][i] == 'T') counts[20]++;
  33.         if(k[x][i] == 'U') counts[21]++;
  34.         if(k[x][i] == 'V') counts[22]++;
  35.         if(k[x][i] == 'W') counts[23]++;
  36.         if(k[x][i] == 'X') counts[24]++;
  37.         if(k[x][i] == 'Y') counts[25]++;
  38.         if(k[x][i] == 'Z') counts[26]++;

  39.     }
  40. }

  41. int main()
  42. {
  43.     for(int i = 1; i <= 4; i++)
  44.     {
  45.         getline(cin,k[i]);
  46.         len[i] = k[i].size();
  47.     }
  48.     for(int i = 1; i <= 4; i++)
  49.     {
  50.         f(i);
  51.     }
  52.     for(int i = 1; i <= 26; i++)
  53.     {
  54.         ans = max(ans,counts[i]);
  55.     }
  56.     m = ans;
  57.     for(int i = 1; i <= ans; i++)
  58.     {
  59.         for(int j = 1; j <= 26; j++)
  60.         {
  61.             if(counts[j] >= m)
  62.             {
  63.                 printf("* ");
  64.             }
  65.             else
  66.             {
  67.                 printf("  ");
  68.             }
  69.         }
  70.         m--;
  71.         printf("\n");
  72.     }
  73.     printf("A B C D E F G H I J K L M N O P Q R S T U V W X Y Z");


  74.     return 0;
  75. }
复制代码
回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
6#
 楼主| 发表于 2018-10-17 09:51:17 | 只看该作者
楼上的此题函数f应该用数组直接跳转
回复 支持 反对

使用道具 举报

23

主题

38

帖子

127

积分

华一学生

积分
127
7#
发表于 2018-10-17 18:55:25 | 只看该作者
luogu P1691 有重复元素的排列问题
我绝对不会说我是用stl的

下面附上AC代码:

  1. #include <bits/stdc++.h>

  2. using namespace std;

  3. char s1[1000];
  4. char s2[1000];
  5. int ans;
  6. int main()
  7. {
  8.     int n;
  9.     scanf("%d",&n);
  10.     scanf("%s",s1);
  11.     sort(s1,s1+n);
  12.     do{
  13.         for(int i = 0;i < n;i++)
  14.         {
  15.             printf("%c",s1[i]);
  16.         }
  17.         ans++;
  18.         printf("\n");
  19.     }while(next_permutation(s1,s1+n));
  20.     printf("%d",ans);
  21.     return 0;
  22. }
复制代码


回复 支持 反对

使用道具 举报

23

主题

38

帖子

127

积分

华一学生

积分
127
8#
发表于 2018-10-17 19:14:10 | 只看该作者
本帖最后由 刘伟杰 于 2018-10-17 19:25 编辑

luogu P1706 全排列问题

其实我是特别想用stl的

方法:裸dfs就ok

附上AC代码:
  1. #include <bits/stdc++.h>

  2. using namespace std;

  3. int a[100];
  4. int book[100];
  5. int n;
  6. void print()
  7. {
  8.     for(int i = 1;i <= n;i++)
  9.     {
  10.         printf("%5d",a[i]);
  11.     }
  12.     printf("\n");
  13. }
  14. void dfs(int x)
  15. {
  16.     if(x == n+1)
  17.     {
  18.         print();
  19.         return;
  20.     }
  21.     for(int i = 1;i <= n;i++)
  22.     {
  23.         if(book[i] == 0)
  24.         {
  25.             book[i] = 1;
  26.             a[x] = i;
  27.             dfs(x+1);
  28.             book[i] = 0;
  29.         }
  30.     }
  31. }


  32. int main()
  33. {
  34.     scanf("%d",&n);
  35.     dfs(1);
  36.     return 0;
  37. }
复制代码

回复 支持 反对

使用道具 举报

23

主题

38

帖子

127

积分

华一学生

积分
127
9#
发表于 2018-10-17 19:15:51 | 只看该作者
本帖最后由 刘伟杰 于 2018-10-17 19:26 编辑

luogu P1157 组合的输出

这跟全排列有区别吗。。。有一点吧

裸dfs

AC代码:
  1. #include <bits/stdc++.h>

  2. using namespace std;

  3. int a[100];
  4. int book[100];
  5. int n;
  6. int k;
  7. int c;
  8. void print()
  9. {
  10.     for(int i = 1;i <= k;i++)
  11.     {
  12.         printf("%3d",a[i]);
  13.     }
  14.     printf("\n");
  15. }
  16. void dfs(int x)
  17. {
  18.     if(x == k+1)
  19.     {
  20.         print();
  21.         return;
  22.     }

  23.     for(int i = a[x-1];i <= n;i++)
  24.     {
  25.         if(book[i] == 0)
  26.         {
  27.             book[i] = 1;
  28.             a[x] = i;
  29.             dfs(x+1);
  30.             book[i] = 0;
  31.         }
  32.     }
  33. }


  34. int main()
  35. {
  36.     scanf("%d%d",&n,&k);
  37.     a[0] = 1;
  38.     dfs(1);
  39.     return 0;
  40. }
复制代码


回复 支持 反对

使用道具 举报

23

主题

38

帖子

127

积分

华一学生

积分
127
10#
发表于 2018-10-17 19:17:35 | 只看该作者
刘伟杰 发表于 2018-10-17 18:55
luogu P1691 有重复元素的排列问题
我绝对不会说我是用stl的

其实应该用搜索的,我错了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-12-27 00:26 , Processed in 0.110753 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表