zoukankan      html  css  js  c++  java
  • 1007 正整数分组 1010 只包含因子2 3 5的数 1014 X^2 Mod P 1024 矩阵中不重复的元素 1031 骨牌覆盖

    1007 正整数分组

    将一堆正整数分为2组,要求2组的和相差最小。
    例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的。
     
    Input
    第1行:一个数N,N为正整数的数量。
    第2 - N+1行,N个正整数。
    (N <= 100, 所有正整数的和 <= 10000)
    Output
    输出这个最小差
    Input示例
    5
    1
    2
    3
    4
    5
    Output示例
    1
    这题不就是小李打怪兽吗,不知道谁模仿谁,呵呵,刚还是我编的题里的,dp,证明一下(要证明什么自己考虑)。
     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<cmath>
     5 #include<cstring>
     6 using namespace std;
     7 
     8 int n,sum;
     9 bool boo[10007];
    10 
    11 int main()
    12 {
    13     scanf("%d",&n);
    14     boo[0]=true,sum=0;
    15     int x;
    16     for (int i=1;i<=n;i++)
    17     {
    18         scanf("%d",&x);
    19         for (int j=10000;j>=x;j--)
    20             if (boo[j-x]) boo[j]=true;
    21         sum+=x;
    22     }
    23     int i=sum/2,j=sum-i;
    24     while (!boo[i]||!boo[j]) i--,j++;
    25     printf("%d
    ",j-i);
    26 }

    1010 只包含因子2 3 5的数

    K的因子中只包含2 3 5。满足条件的前10个数是:2,3,4,5,6,8,9,10,12,15。
    所有这样的K组成了一个序列S,现在给出一个数n,求S中 >= 给定数的最小的数。
    例如:n = 13,S中 >= 13的最小的数是15,所以输出15。
     
    Input
    第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 10000)
    第2 - T + 1行:每行1个数N(1 <= N <= 10^18)
    Output
    共T行,每行1个数,输出>= n的最小的只包含因子2 3 5的数。
    Input示例
    5
    1
    8
    13
    35
    77
    Output示例
    2
    8
    15
    36
    80
    枚举处理出在范围内的所有满足条件的数+排序,然后二分找答案就可以了。
     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<cmath>
     5 #include<cstring>
     6 using namespace std;
     7 
     8 typedef long long LL;
     9 const LL INF=1e18+7;
    10 
    11 int n,cnt=0;
    12 LL a[100007];
    13 
    14 void init()
    15 {
    16     for (LL i=1;i<=INF;i*=2)
    17         for (LL j=1;j*i<=INF;j*=3)
    18             for (LL k=1;k*i*j<=INF;k*=5)
    19                 a[++cnt]=i*j*k;
    20     sort(a+1,a+cnt+1);
    21 }
    22 int main()
    23 {
    24     init();
    25     scanf("%d",&n);
    26     LL x;
    27     for (int i=1;i<=n;i++)
    28     {
    29         scanf("%lld",&x);
    30         printf("%lld
    ",*lower_bound(a+2,a+cnt+1,x));
    31     }
    32 } 
                      1014 X^2 Mod P
    X*X mod P = A,其中P为质数。给出P和A,求<=P的所有X。
     
    Input
    两个数P A,中间用空格隔开。(1 <= A < P <= 1000000, P为质数)
    Output
    输出符合条件的X,且0 <= X <= P,如果有多个,按照升序排列,中间用空格隔开。
    如果没有符合条件的X,输出:No Solution
    Input示例
    13 3
    Output示例
    4 9
     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<cmath>
     5 #include<cstring>
     6 using namespace std;
     7 
     8 int top=0,p,a;
     9 int ans[1000007]={0};
    10 
    11 int main()
    12 {
    13     scanf("%d%d",&p,&a);
    14     for (int i=0;i<=p;i++)
    15     {
    16         long long x;
    17         x=(long long)i*i;
    18         if (x%p==a) ans[++top]=i;
    19     }
    20     if (top==0) printf("No Solution
    ");
    21     else
    22     {
    23         for (int i=1;i<top;i++)
    24             printf("%d ",ans[i]);
    25         printf("%d
    ",ans[top]);    
    26     }
    27 }

    1024 矩阵中不重复的元素

    一个m*n的矩阵。
     
    该矩阵的第一列是a^b,(a+1)^b,.....(a + n - 1)^b
    第二列是a^(b+1),(a+1)^(b+1),.....(a + n - 1)^(b+1)
    .......
    第m列是a^(b + m - 1),(a+1)^(b + m - 1),.....(a + n - 1)^(b + m - 1)
    (a^b表示a的b次方)
     
    下面是一个4*4的矩阵:
     
    2^2=4, 2^3=8, 2^4=16, 2^5=32
    3^2=9, 3^3=27, 3^4=81, 3^5=243
    4^2=16, 4^3=64, 4^4=256, 4^5=1024
    5^2=25, 5^3=125, 5^4=625, 5^5=3125
     
    问这个矩阵里有多少不重复的数(比如4^3 = 8^2,这样的话就有重复了)
     
    2^2=4, 2^3=8, 2^4=16, 2^5=32
    3^2=9, 3^3=27, 3^4=81, 3^5=243
    4^2=16, 4^3=64, 4^4=256, 4^5=1024
     
    m = 4, n = 3, a = 2, b = 2。其中2^4与4^2是重复的元素。
     
    Input
    输入数据包括4个数:m,n,a,b。中间用空格分隔。m,n为矩阵的长和宽(2 <= m,n <= 100)。a,b为矩阵的第1个元素,a^b(2 <= a , b <= 100)。
    Output
    输出不重复元素的数量。
    Input示例
    4 3 2 2
    Output示例
    11
    一个hash的事情。
     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cmath>
     4 #include<iostream>
     5 #include<cstring>
     6 #include<map>
     7 using namespace std;
     8 
     9 typedef long long LL;
    10 const LL mod=132141367;
    11 
    12 int m,n,a,b,ans;
    13 map<int,bool>p;
    14 
    15 int main()
    16 {
    17     scanf("%d%d%d%d",&m,&n,&a,&b);
    18     ans=m*n;
    19     for (int i=1;i<=n;i++)
    20     {
    21         LL x=1,jed=(a+i-1);
    22         for (int j=1;j<b;j++)
    23             x=x*jed%mod;    
    24         for (int j=1;j<=m;j++)
    25         {
    26             x=x*jed%mod;
    27             if (p[x]) ans--;
    28             else p[x]=true;
    29         }
    30     }
    31     printf("%d
    ",ans);
    32 } 

    1031 骨牌覆盖

    在2*N的一个长方形方格中,用一个1*2的骨牌排满方格。
     
    问有多少种不同的排列方法。
     
    例如:2 * 3的方格,共有3种不同的排法。(由于方案的数量巨大,只输出 Mod 10^9 + 7 的结果)
    Input
    输入N(N <= 1000)
    Output
    输出数量 Mod 10^9 + 7
    Input示例
    3
    Output示例
    3
    比铺砖块要水吧,转移的东西都少,一般的状态压缩。
     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cmath>
     4 #include<iostream>
     5 #include<cstring>
     6 using namespace std;
     7 
     8 const int mod=1e9+7;
     9 
    10 int n,m,cnt=0;
    11 int f[1007][7]={0};
    12 struct Node
    13 {
    14     int x,y;
    15 }next[7];
    16 
    17 void dfs(int num,int sta,int old)
    18 {
    19     if (num>m) return;
    20     if (num==m)
    21     {
    22         next[++cnt].x=old;
    23         next[cnt].y=sta;
    24         return;
    25     }
    26     dfs(num+1,(sta<<1)+1,old<<1);
    27     dfs(num+2,sta<<2,old<<2);
    28     dfs(num+1,sta<<1,(old<<1)+1);
    29 }
    30 int main()
    31 {
    32     scanf("%d",&n);
    33     m=2;
    34     dfs(0,0,0);
    35     f[0][0]=1;
    36     for (int i=1;i<=n;i++)
    37         for (int j=1;j<=cnt;j++)
    38         {
    39             int x=next[j].x,y=next[j].y;
    40             f[i][y]=(f[i][y]+f[i-1][x])%mod;
    41         }
    42     printf("%d
    ",f[n][0]);    
    43 }
  • 相关阅读:
    hdu 2151 Worm (DP)
    .NET中使用switch和java不一样的地方。
    逻辑运算符||和| 、&&和&的区别
    赋值表达式也有值
    交换两个变量的值(面试题)
    .NET中的 枚举
    .NET FrameWork 中的 CTS
    .NET中变量的类型问题
    .NET中的标识符、关键字 以及 .NET中的命名规范
    .NET中的注释种类,单行注释、多行注释、文档注释。。。
  • 原文地址:https://www.cnblogs.com/fengzhiyuan/p/7261144.html
Copyright © 2011-2022 走看看