zoukankan      html  css  js  c++  java
  • 2017 Multi-University Training Contest

    HDU6140 Hybrid Crystals

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6140

    题目意思:这场多校是真的坑,题目爆长,心态爆炸,题目意思就是给定一个序列。序列的每个值都有属性,N代表可加可减,L代表只能加,D代表只能减,当然这些都可以用或者不用。给定一个k,问k是否可能用这个序列构成。

    思路: 源头都来自这个奇怪的式子

    解释一下这个式子什么意思:

    如果b[i]是N那么所有b[j](j<i)属性是N的和大于b[i]。

    如果b[i]是L那么所有b[j](j<i)属性是N和L的和小于b[i]。

    如果b[i]是L那么所有b[j](j<i)属性是N和R的和小于b[i]。

    偷个懒直接把题解截图过来。因为题目保证一开始a[1]=1,且type=N,那么一开始我们可以表示[-1,1]范围内的整数,现在a[2]<=a[1],假设a[2]=1,那么如果type为L那么我们现在就可以表示[-2,1]范围内的所有整数了,如果type为R就可以表示[-1,2]范围内的整数了。所以以此类推,再结合上述题解中的解释,我们只需要从头到尾扫一遍就知道,是否可以构成指定整数了,思维题啊!!!

    代码:

     1 //Author: xiaowuga
     2 #include <iostream>
     3 #include <algorithm>
     4 #include <set>
     5 #include <vector>
     6 #include <queue>
     7 #include <cmath>
     8 #include <cstring>
     9 #include <cstdio>
    10 #include <ctime>
    11 #include <map>
    12 #include <bitset>
    13 #include <cctype>
    14 #define maxx INT_MAX
    15 #define minn INT_MIN
    16 #define inf 0x3f3f3f3f
    17 #define mem(s,ch) memset(s,ch,sizeof(s))
    18 #define nc cout<<"nc"<<endl
    19 #define sp " "
    20 const long long N=100000; 
    21 using namespace std;
    22 typedef long long LL;
    23 typedef int II;
    24 II n,k;
    25 II a[1000+10];
    26 char  b[1000+10];
    27 int main() {
    28     ios::sync_with_stdio(false);cin.tie(0);
    29     II T;
    30     cin>>T;
    31     while(T--){
    32         cin>>n>>k;            
    33         for(II i=0;i<n;i++) cin>>a[i];
    34         for(II i=0;i<n;i++){
    35             cin>>b[i]; 
    36         }
    37         II l=0,r=0;
    38         for(II i=0;i<n;i++){
    39             if(b[i]=='N'){l-=a[i]; r+=a[i];}
    40             else if(b[i]=='L') r+=a[i];
    41             else l-=a[i];
    42         }
    43         if(k>=l&&k<=r) cout<<"yes"<<endl;
    44         else cout<<"no"<<endl;
    45     }
    46     return 0;
    47 }
    View Code

    HDU6143  Killer Names

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6143

    题目意思:要求构造若干名字,名字包括 first name last name 两部分,均需包含 n 个字符,已知有 m 种字符供选择,求最多有多少种不同的构造方法,使得 first name 和 last name 不含相同字符。

    题目思路:不想说什么……组合数学,自己百度第二类斯特林数,公式就是∑C(m,i)*S(n,i)*A[i]*(m-i)^n,好好理解一下这个公式,第二类斯特林数就是n个无差别的坑和i个东西,要把东西放进去有多少种放法,现在注意我们这里是有差别的,所以再乘一个阶乘数就可以了。

    代码:

     1 //Author: xiaowuga
     2 #include <iostream>
     3 #include <algorithm>
     4 #include <set>
     5 #include <vector>
     6 #include <queue>
     7 #include <cmath>
     8 #include <cstring>
     9 #include <cstdio>
    10 #include <ctime>
    11 #include <map>
    12 #include <bitset>
    13 #include <cctype>
    14 #define maxx INT_MAX
    15 #define minn INT_MIN
    16 #define inf 0x3f3f3f3f
    17 #define mem(s,ch) memset(s,ch,sizeof(s))
    18 #define nc cout<<"nc"<<endl
    19 #define sp " "
    20 const long long N=2000+5; 
    21 const long long mod=1e9+7;
    22 using namespace std;
    23 typedef long long LL;
    24 typedef int II;
    25 LL C[N][N]={0},S[N][N]={0},A[N]={0};
    26 void init(){
    27     for(II i=0;i<N;i++) C[i][0]=1;
    28     for(II i=1;i<N;i++)
    29         for(II j=1;j<=i;j++){
    30             C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
    31         } 
    32     A[1]=1;
    33     for(II i=2;i<N;i++){
    34         A[i]=A[i-1]*i%mod;
    35     }
    36     for(II i=0;i<N;i++){
    37         S[i][i]=1;
    38         if(i>=1) S[i][0]=0;
    39         for(II j=1;j<i;j++) 
    40             S[i][j]=(j*S[i-1][j]+S[i-1][j-1]+mod)%mod;
    41     }
    42 }
    43 LL q_power(LL a,LL k){
    44     LL ans=1;
    45     while(k){
    46         if(k%2) ans=(ans*a%mod+mod)%mod;
    47         k/=2;
    48         a=(a*a%mod+mod)%mod;
    49     }
    50     return ans;
    51 }
    52 int main() {
    53     ios::sync_with_stdio(false);cin.tie(0);
    54     II T;
    55     init();
    56     cin>>T;
    57     II n,m;
    58     LL ans=0;
    59     while(T--){
    60         cin>>n>>m; 
    61         ans=0;
    62         for(II i=1;i<=m-1;i++){
    63             LL t1=C[m][i]*S[n][i]%mod;
    64             t1=t1*A[i]%mod;
    65             LL t2=q_power((m-i),n)%mod;
    66             LL tmp=t1*t2%mod;
    67             ans=(ans+tmp)%mod;
    68         }
    69         cout<<ans<<endl;
    70     }
    71     return 0;
    72 }
    View Code
  • 相关阅读:
    编译型与解释型、动态语言与静态语言、强类型语言与弱类型语言的区别
    【转】 Oracle 用户权限管理方法
    oracle实例内存(SGA和PGA)调整
    oracle修改内存使用和性能调节,SGA
    下星期计划——9.7~9.13
    医疗数据分析——过高费用的异常检测
    Groovy介绍
    Java 7代码层面上的更新
    Java陷阱之assert关键字
    支持向量机(SVM)、支持向量回归(SVR)
  • 原文地址:https://www.cnblogs.com/xiaowuga/p/7528633.html
Copyright © 2011-2022 走看看