zoukankan      html  css  js  c++  java
  • Hao Yin Jian 寒假第一周

    题目链接:https://vjudge.net/contest/147561#problem/A

    题意:除法运算,abcde / fghij = n,从小到大输出,其中abcdefghij为0~9的不重复数字。

    分析:

    1、从小到大其实就是一大就跟着大。

    2、不用枚举0~9的全排列,只用枚举其中一个数fghij即可,算出abcde,看是不是0~9都有。

    Tip: sprintf(*,格式输入,*);用法,把目标数据转成char * 型。

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 int main()
     6 {
     7     //freopen("in.txt","r",stdin);
     8     int n;
     9     int kase = 0;
    10     while(scanf("%d",&n),n)
    11     {
    12         if(kase++)
    13             puts("");
    14         int cnt = 0;
    15         char buf[99];
    16         for(int fghij=1234;; fghij++)
    17         {
    18             int abcde = fghij*n;
    19             sprintf(buf,"%05d%05d",abcde,fghij);
    20             if(strlen(buf)>10) break;
    21             sort(buf,buf+10);
    22 
    23             bool flag = true;
    24             for(int i=0; i<10; i++)
    25                 if(buf[i]!=i+'0')
    26                 {
    27                     flag = false;
    28                     break;
    29                 }
    30 
    31             if(flag)
    32             {
    33                 cnt ++;
    34                 printf("%05d / %05d = %d
    ",abcde,fghij,n);
    35             }
    36 
    37         }
    38 
    39         if(cnt==0)
    40             printf("There are no solutions for %d.
    ",n);
    41     }
    42     return 0;
    43 }
    View Code

    题目链接:https://vjudge.net/contest/147561#problem/B

    题意:最大乘法,要你找出一个连续子序列乘积最大。

    分析:打算枚举起点,终点,求和,肯定是TLE,利用前缀和的思想修改一下,变成前缀积。

     1 #include <bits/stdc++.h>
     2 #include <algorithm>
     3 
     4 using namespace std;
     5 
     6 int x[20];
     7 
     8 int main()
     9 {
    10     int n;
    11     int cases = 1;
    12     while(scanf("%d",&n)!=EOF)
    13     {
    14         for(int i=0; i<n; i++)
    15             scanf("%d",&x[i]);
    16 
    17         long long ans = 0;
    18         for(int i=0; i<n; i++) {
    19             long long tmp = 1;
    20             for(int j=i; j<n; j++)
    21             {
    22                 tmp = tmp*(long long)x[j];
    23                 ans = max(ans,tmp);
    24             }
    25         }
    26         printf("Case #%d: The maximum product is %lld.
    
    ",cases++,ans);
    27 
    28     }
    29     return 0;
    30 }
    View Code

    题目链接:https://vjudge.net/contest/147561#problem/C

    题意:分数拆分。(x>=y) 找出所有 x,y,使得 1/k = 1/x + 1/y;

    分析:由于是两个数的和,起点很容易知道,就是从 k 开始,但是不能够一直枚举下去,总要有一个结束点,这个结束点就是 2k,1/x + 1/y <= 2/y; 就有 y<=2k;

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 int main()
     6 {
     7 
     8     int k;
     9     while(scanf("%d",&k)!=EOF) {
    10         vector<int> ansx,ansy;
    11         int cnt = 0;
    12         for(int y=k+1;y<=2*k;y++) {
    13             if((y*k)%(y-k)==0)
    14             {
    15                 cnt ++;
    16                 int x = y*k/(y-k);
    17                 ansx.push_back(x);
    18                 ansy.push_back(y);
    19                 //printf("1/%d = 1/%d + 1/%d
    ",k,x,y);
    20             }
    21         }
    22         printf("%d
    ",cnt);
    23         for(int i=0;i<cnt;i++)
    24             printf("1/%d = 1/%d + 1/%d
    ",k,ansx[i],ansy[i]);
    25     }
    26     return 0;
    27 }
    View Code

    题目链接:https://vjudge.net/contest/147561#problem/D

    题意:素数环。

    分析:http://www.cnblogs.com/TreeDream/p/5712621.html

    枚举每一个位置,这个时候就要回溯了。

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 int prime[50]= {0}; ///是素数就是0
     5 bool vis[50];
     6 int ans[25];
     7 int n;
     8 
     9 void dfs(int k)
    10 {
    11     if(k==n+1)
    12     {
    13         for(int i = 1; i <=n; i++)
    14         {
    15             if(i!= 1) printf(" ");
    16             printf("%d", ans[i]);
    17         }
    18         printf("
    ");
    19         return ;
    20     }
    21     else if(k==n)
    22     {
    23         for(int i=1; i<=n; i++)
    24         {
    25             if(!vis[i]&&!prime[ans[k-1]+i]&&!prime[i+ans[1]])
    26             {
    27                 ans[k] = i;
    28                 vis[i]=true;
    29                 dfs(k+1);
    30                 vis[i] = false;
    31             }
    32         }
    33     }
    34     else
    35     {
    36         for(int i=1; i<=n; i++)
    37         {
    38             if(!vis[i]&&!prime[ans[k-1]+i])
    39             {
    40                 ans[k] = i;
    41                 vis[i]=true;
    42                 dfs(k+1);
    43                 vis[i] = false;
    44             }
    45         }
    46     }
    47 }
    48 
    49 int main()
    50 {
    51     //freopen("in.txt","r",stdin);
    52     int kase = 0;
    53     ///打出40个素数来
    54     for(int i=2; i<8; i++)
    55         if(!prime[i])
    56             for(int j=i*i; j<50; j+=i)
    57                 prime[j] = 1;
    58 
    59     int Case = 1;
    60     while(scanf("%d",&n)!=EOF)
    61     {
    62         if(kase>0) printf("
    ");
    63         memset(vis,false,sizeof(vis));
    64         memset(ans,0,sizeof(ans));
    65         printf("Case %d:
    ",Case++);
    66         ans[1] = 1;
    67         vis[1] = true;
    68         dfs(2);
    69         kase++;
    70     }
    71 
    72     return 0;
    73 }
    View Code

    题目链接:https://vjudge.net/contest/147561#problem/E

    题意:困难的串,有相邻的重复子串的就不是困难的串。输入n ,l,l 为可供你多少个字符选择,找出困难串里面的字典序第 n 的串。

    分析:

    枚举当前位置的字符,但是你要查是否有连续子串,然后状态转移到下一个位置,至于字典序的问题,只要每次从A开始就行了,当有了n 个,就输出。

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 int n,l;
     6 int cnt;
     7 int s[100];
     8 
     9 int dfs(int cur)
    10 {
    11     if(cnt++==n)
    12     {
    13         for(int i=0; i<cur; i++)
    14         {
    15             if(i%64==0&&i>0) puts("");
    16             else if(i%4==0&&i>0) printf(" ");
    17             printf("%c",'A'+s[i]);
    18         }
    19         printf("
    %d
    ",cur);
    20         return 0;
    21     }
    22 
    23     for(int i=0; i<l; i++)
    24     {
    25         s[cur] = i;
    26         int ok = 1;
    27         for(int j=1; j*2<=cur+1; j++)
    28         {
    29             int equal =  1;
    30             for(int k=0; k<j; k++)
    31             {
    32                 if(s[cur-k]!=s[cur-k-j])
    33                 {
    34                     equal = 0;
    35                     break;
    36                 }
    37             }
    38             if(equal) {
    39                 ok = 0;
    40                 break;
    41             }
    42         }
    43         if(ok) if(!dfs(cur+1)) return 0;
    44     }
    45     return 1;
    46 }
    47 
    48 int main()
    49 {
    50     while(scanf("%d%d",&n,&l),n)
    51     {
    52         cnt = 0;
    53         dfs(0);
    54     }
    55 
    56     return 0;
    57 }
    View Code
  • 相关阅读:
    Comet OJ
    LOJ#2719. 「NOI2018」冒泡排序 DP+组合+树状数组
    LuoguP6747 『MdOI R3』Teleport 二进制+贪心
    LuoguP6748 『MdOI R3』Fallen Lord 树形DP+set
    LuoguP5576 [CmdOI2019]口头禅 后缀树+线段树+暴力
    LOJ#3161. 「NOI2019」I 君的探险 整体二分+随机化+二进制分组
    LOJ#2085. 「NOI2016」循环之美 莫比乌斯反演+杜教筛
    LuoguP5327 [ZJOI2019]语言 线段树合并+树链求并
    【考试题
    ELK
  • 原文地址:https://www.cnblogs.com/TreeDream/p/6289226.html
Copyright © 2011-2022 走看看