模拟赛3

1.HDU:5138

签到题;直接减去那5个数就行了

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=1e6+10;
typedef long long ll;
int ans[maxn];
int b[maxn];
int main(){
    std::ios::sync_with_stdio(false);
    int n;
    while(cin>>n){
        ans[1]=n-15;
        ans[2]=n-7;
        ans[3]=n-4;
        ans[4]=n-2;
        ans[5]=n-1;
        int tot=0;
        for(int i=1;i<=5;i++){
            if(ans[i]>0){
                b[tot++]=ans[i];
            }
        }
        for(int i=0;i<tot;i++){
            if(i==tot-1)cout<<b[i]<<endl;
            else cout<<b[i]<<' ';
        }
    }



    return 0;
}
View Code

2.HDU:6075

题意:给一个数组ai,求ai%m=k的个数大于其余的个数;

直接判断奇偶数个数;

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int a[maxn];
int main(){
    ios::sync_with_stdio(false);
    int T;
    cin>>T;
    while(T--){
        int n;
        cin>>n;
        int cnt1=0,cnt2=0;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            if(a[i]%2)cnt1++;
            else cnt2++;
        }
        if(cnt1>cnt2){
            cout<<"2"<<' '<<"1"<<endl;
        }
        else cout<<"2"<<' '<<"0"<<endl;
    }



    return 0;
}
View Code

3.poj:2967

题意:给你n个木棒,判断是否符合条件:至少有三个木棒可以组合成三角形,并且存在三个木棒不能组合成三角形;

!!!!这题卡输入,当时没板子,就一直T;

解:排序,然后扫一遍记录能否组合成三角形,然后再用最小的两个木棒和最大的木棒,记录是否能形成三角形;

要用字符快读;

#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=1e6+10;
typedef long long ll;
ll a[maxn];
inline int read(){
    ll x=0LL,f=1LL;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)a[i]=read();
    //for(int i=1;i<=n;i++)cout<<a[i]<<' ';cout<<endl;
    sort(a+1,a+1+n);
    int flag=0,cnt=0;
    for(int i=1;i<=n-2;i++){
        if((1LL*a[i]+1LL*a[i+1])>a[i+2])flag=1;
        else cnt=1;
    }
    if((1LL*a[1]+1LL*a[2])<=a[n])cnt=1;
    if((flag==0)||(cnt==0))printf("The set is rejected.\n");
    else printf("The set is accepted.\n");



    return 0;
}
View Code

4.CF-892D

题意:给一个数组a,构造一个数组b,满足b上每个位置的每个字串前缀和都和a不同;

!!!当时读错题意:以为只是前缀和不同……狂wa,还tm以为是对的;

解:对a排序另存c,然后对每个ai找第一个大于ai的值放在bi(必定保证每个字串的前缀和不同),然后遇到最大值,放最小值;

#include <bits/stdc++.h>
using namespace std;
const int maxn=100;
int a[maxn];
int b[maxn];
int ans[maxn];
bool vis[maxn];
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        b[i]=a[i];
    }
    sort(b+1,b+1+n);
    for(int i=1;i<=n;i++){
        int flag=0;
        for(int j=1;j<=n;j++){
            if(a[i]<b[j]&&!vis[j]){
                ans[i]=b[j];
                vis[j]=true;
                flag=1;
                break;
            }
        }
        if(flag==0){
            ans[i]=b[1];
            vis[1]=true;
        }
    }
    for(int i=1;i<=n;i++){
        cout<<ans[i]<<' ';
    }
    cout<<endl;

    return 0;
}
View Code

5.HDU:5687

题意:字典树;

!!!不知道错哪了,回宿舍再打一遍就。。。。。tm;

#include <bits/stdc++.h>
using namespace std;
struct node{
    node *next[30];
    int cnt;
    node(){
        for(int i=0;i<30;i++)next[i]=NULL;
        cnt=0;
    }
};
node *root=new node();
void add(string s){
    int len=s.size();
    node *p=root;
    for(int i=0;i<len;i++){
        int x=s[i]-'a';
        if(p->next[x]==NULL)p->next[x]=new node();
        p=p->next[x];
        p->cnt++;
    }
}
void gao(string s){
    node *p=root;
    int len=s.size();
    for(int i=0;i<len;i++){
        int x=s[i]-'a';
        if(p->next[x]==NULL){
            cout<<"No"<<endl;return;
        }
        p=p->next[x];
    }
    if(p->cnt>0)cout<<"Yes"<<endl;
    else cout<<"No"<<endl;
}
void alldel(node *p){
    if(p==NULL)return;
    for(int i=0;i<30;i++){
        if(p->next[i]==NULL)alldel(p->next[i]);
    }
    delete(p);
}
void del(string s){
    int len=s.size();
    node *p=root,*pre;
    for(int i=0;i<len;i++){
        int x=s[i]-'a';
        if(p->next[x]==NULL)return ;
        pre=p;
        p=p->next[x];
    }
    int num=p->cnt;
    alldel(p);
    pre->next[s[s.size()-1]-'a']=NULL;
    p=root;
    for(int i=0;i<len-1;i++){
        int x=s[i]-'a';
        p=p->next[x];
        p->cnt-=num;
    }
}
int main(){
    int n;
    cin>>n;
    while(n--){
        string s,q;
        cin>>q>>s;
        if(q[0]=='i')add(s);
        else if(q[0]=='s')gao(s);
        else del(s);

    }



    return 0;
}
View Code

6.LightOJ-1095

题意:给1-n的数,求1-m中k个数位置不变的组合数;

错排:为啥他们都知道,就我不知道。。。~弱鸡

解:C(m,k)从m选k个不变的,剩下的m-k个错排,然后还有n-m个数,可能0个错排,1个错排,2,3,。。。;

所以要枚举所有可能;

错排公式:Dn=(n-1)(Dn-1+Dn-2);

#include <iostream>
using namespace std;
typedef long long ll;
const int maxn=1e4+10;
const int mod=1e9+7;
ll c[maxn];
ll inv[maxn],fac[maxn],ans[maxn],pos[maxn];
ll qpow(ll a,int b)
{
    ll ans=1;
    a%=mod;
    while(b)
    {
        if(b&1)
            ans=(ans*a)%mod;
        a=(a*a)%mod;
        b/=2;
    }
    return ans;
}
void pre()
{
    fac[0]=fac[1]=1;
    for(int i=2;i<maxn;++i) fac[i]=i*fac[i-1]%mod;
    inv[maxn-1]=qpow(fac[maxn-1],mod-2);
    for(int i=maxn-2;i>=0;i--) inv[i]=inv[i+1]*(i+1)%mod;
}
ll Comb(int n,int k)//求C(n,k)
{
    if (k < 0 || k > n) return 0;
    return fac[n]*inv[k]%mod *inv[n-k]%mod;
}
void init(){
    c[0]=1;
    c[1]=0;
    c[2]=1;
    for(ll i=3;i<=1005;i++)
        c[i]=((i-1)*(c[i-1]+c[i-2]))%mod;
}
int main(){
    init();
    pre();
    int T;
    cin>>T;
    int flag=1;
    while(T--){
        int n,m,k;
        cin>>n>>m>>k;
        ll ans=0;
        for(int i=0;i<=n-m;i++){
            ans=(ans+(c[n-k-i]%mod*Comb(n-m,i)%mod)%mod)%mod;
        }
        ans=((ans%mod)*(Comb(m,k)%mod))%mod;
        cout<<"Case "<<flag++<<": ";
        cout<<ans<<endl;
    }



    return 0;
}
View Code

7.HDU:2962

8.CF:763A

猜你喜欢

转载自www.cnblogs.com/lin1874/p/11426880.html