首页 > 其他 > 详细

2019CCPC-江西省赛(重现赛)- 感谢南昌大学

时间:2019-11-11 21:30:04      阅读:129      评论:0      收藏:0      [点我收藏+]

D题:

题目大意:在一组数列中选择两个数,使其可以构成"wave"的最大长度,比如说对于数列1 2 1  3  2

选择12的话,不要看3,这两个数字可以构成的“”wave“”最大长度为4,对于数列1 2  1 1 2 可以构成的最大长度也是4 ,对于选择好的数,我们可以选择性的保留,也就是说我们可以舍弃一个1..(没读懂题意,wa了好几发)

思路:记录每个数字出现的位置,然后暴力枚举每一种情况,然后取最大。(听说正解是dp)

ACcode

#include<bits/stdc++.h>
using namespace std;
const int N=1E2+7;
vector<int >ve[N];

int check(int a,int b){
    int i=1,ja=0,jb=0,j=-1;
    int aa=ve[a].size();
    int bb=ve[b].size();
    int ans=0;
    while(1){
        if(i&1){
            while(ja<aa&&ve[a][ja]<j){
                ja++;
            }
            if(ja==aa) break;
            j=ve[a][ja];
            ans++;
        }
        else {
            while(jb<bb&&ve[b][jb]<j){
                jb++;
            }
            if(jb==bb) break;
            j=ve[b][jb];
            ans++;
        }
        i++;
    }
    return ans;
}
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    int a;
    for(int i=1;i<=n;i++){
        scanf("%d",&a);
        ve[a].push_back(i);
    }
    int ans=0;
    
    for(int i=1;i<=m;i++){
        if(ve[i].size()==0) continue ;
        for(int j=1;j<=m;j++){
            if(ve[j].size()==0||i==j) continue ;
            ans=max(ans,check(i,j));
        }
    }
    printf("%d\n",ans);
    return 0;
}

https://blog.csdn.net/qq_41646772/article/details/96831855

dp解法,用一个二维数组,记录i到j的长度,从i到j的长度等以从j到i的长度+1,即dp[i][j]=d[j][i]+1

dpcode

#include<bits/stdc++.h>
using namespace std;
const int N=1E2+7;
int dp[N][N];
int main(){
    int n,m;
    cin>>n>>m;
    int ans=0;
    int x;
    for(int i=1;i<=n;i++){
        cin>>x;
        for(int j=1;j<=m;j++){
            dp[j][x]=dp[x][j]+1;
            if(j==x) continue ;
            ans=max(ans,dp[j][x]);
        }
    }
    cout<<ans<<endl;
    return 0;
}

 

F题  记录每个字符出现的次数计即可

#include<bits/stdc++.h>
using namespace std;
const int N=1000;
char arr[N];
int a,v,i,n;

int main(){
    int m;
    while(scanf("%d",&m)!=EOF){
        a=0,v=0,i=0,n=0;
        scanf("%s",arr+1);
        int l=strlen(arr+1);
        
        for(int j=1;j<=l;j++){
            if(arr[j]==a) a++;
            if(arr[j]==v) v++;
            if(arr[j]==i) i++;
            if(arr[j]==n) n++;
        }
        
        int x=a*v*i*n;
        int s=pow(m,4);
        if(x==0){
            cout<<0<<"/"<<1<<endl;
        }
        else {
            cout<<x/__gcd(x,s)<<"/"<<s/__gcd(x,s)<<endl;
        }
    }
    return 0;
}

G题 

一开始诶读懂题意,以为是能过就过,不能过的话在南北方向的车等待。然而不是,题意是一起等待。。。(无聊至极)

二分水过

#include<bits/stdc++.h>
using namespace std;
const int N=1E3+7;
int arr[N];
int brr[N];
int n,m;
bool check(int s){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(arr[i]==brr[j]+s) return false;
            if(arr[i]<brr[j]+s) break;
        }
    }
    return true;
}
int main(){
    while(scanf("%d%d",&n,&m)!=EOF){
        for(int i=1;i<=n;i++)    scanf("%d",&arr[i]);    
        for(int i=1;i<=m;i++)    scanf("%d",&brr[i]);
        sort(arr+1,arr+1+n);
        sort(brr+1,brr+1+m);
        int l=0,r=2000;
        int ans=1000000;
        while(l<=r){
            int mid=(l+r)/2;
            if(check(mid)){
                ans=min(mid,ans);
                r=mid-1;
            }
            else {
                l=mid+1;
            }
        }
        printf("%d\n",ans);
    }    
    return 0;
}

H-RNG

打表找规律吧,,一定能找到的。。。。。

2/2 ,,3/4,,,4/6,,,5/8

//2/2  3/4  4/6  5/8
//   1    2    3   4
#include<bits/stdc++.h>
using namespace std;
typedef long long l
const ll mod=1e9+7;
ll ksm(ll n,ll m){
    ll res=1;
    while(m){
        if(m&1) res=res*n%mod;
        m>>=1;
        n=n*n%mod;
    }
    return res%mod;
}


int main(){
    ll n;
    while(~scanf("%dll",&n)){
        ll a=n+(ll)1 ;
        cout<<a*ksm((ll)2*n,mod-2)%mod<<endl;
    }
    return 0;
}

I--

被这个题目卡了好久,用long double输入不对,最后用字符串输入的。。。直接保留小数点后三位就可以了,其余的不用管。

AC代码

#include<bits/stdc++.h>
using namespace std;
const int N=100;
char arr[N];
int main(){
    int t;
    while(scanf("%d",&t)!=EOF){
        int c=0;
        for(int i=1;i<=t;i++){
            scanf("%s",arr);
            int s=strlen(arr);
            int ans=0;
            
            for(int j=s-1;;j--){
                if(arr[j]==.){
                    for(int k=j+1;k<s;k++){
                        ans*=10;
                        ans+=arr[k]-0;
                    }
                    break;
                }
            }
            int sum=0;
            int x=ans%10;
            if(x>=0&&x<=4){
                sum=ans-x;
            }
            else {
                sum=ans-x+10;    
            }
            c+=sum-ans;        
        }
        float q=1000;
        printf("%.3f\n",c/q);
    }
    return 0;
}

J-worker 

每个仓库完成的额度相同,所以想到的lcm,,,然后二分就可以了,注意l和r的取值,l最小为lcm*1,,r最大为m/lcm

注意输出格式,PE了一发

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1000+7;
ll arr[N];
ll mark[N];
ll n,m;

ll check(ll s){
    ll sum=0;
    for(ll i=1;i<=n;i++){
        sum+=s/arr[i]; 
        mark[i]=s/arr[i];
    }
    if(sum==m) return 1;
    if(sum>m) return 0;
    else return 2;
}

int main(){
    while(~scanf("%lld%lld",&n,&m)){
        for(ll i=1;i<=n;i++)    scanf("%lld",&arr[i]);
        ll base=arr[1];
        
        for(ll i=2;i<=n;i++){
            base=base*arr[i]/__gcd(base,arr[i]);
        }
        
        ll l=1,r=m/base;
        bool flag=false ;
        
        while(l<=r){
            ll mid=(l+r)/2;
            ll x=check(mid*base);
            if(x==1){
                puts("Yes");
                flag=true;
                for(ll i=1;i<=n;i++){
                    if(i==1)    printf("%lld",mark[i]);
                    else printf(" %lld",mark[i]);
                }
                puts("");
                break;
            }
            else{
                if(x==0){//人数不够 
                    r=mid-1;
                }
                else if(x==2) {//人数太多 
                    l=mid+1;
                }
            }
            
        }
        if(!flag) puts("No");
    }
    return 0;
}

 

2019CCPC-江西省赛(重现赛)- 感谢南昌大学

原文:https://www.cnblogs.com/Accepting/p/11837966.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!