Wishare第十届网络预选赛

这里写图片描述
这里写图片描述
A题
题意分析:
先把三个数由小到大排序,记做ABC。
我们先考虑把B变得和C一样大,那么全部采用在A和B碗各加一块肉。
然后判断此时的A和BC的差是不是偶数,偶数则全加2块肉和BC一样即可。
否则BC都加一块肉,然后重复上一个步骤即可。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
int a[5];
int step=0;

int main(){
    int T;
    cin>>T;
    while(T--){
        memset(a,0,sizeof(a));
        for(int i=0;i<3;i++){
            cin>>a[i];
        }
        sort(a,a+3);
        int x=0;
        int y=a[1]-a[0];
        int z=a[2]-a[0];
        step=z-y;
        x=x+step;
        int ans=z-x;
        if(ans%2==0) step+=ans/2;
        else {
            step+=(ans+1)/2;
            step++;
        }
        cout<<step<<endl;
    } 
    return 0;
}

这里写图片描述
这里写图片描述
C题
背包问题。
dp[i][j]表示在前i件物品,前j分钟内花费最多的时间。

#include<iostream>
#include<cstring>
using namespace std;
int T,n,ai,bi,t[200],total,dp[200][20000],p;
int max(int a,int b){return a>b?a:b;}
int main(){
    cin>>T;
    while(T--){
        memset(t,0,sizeof(t));
        memset(dp,0,sizeof(dp));
        p=0;
        total=0;
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>ai>>bi;
            for(int j=1;j<=bi;j++){
                t[++p]=ai;
                total+=ai;
            }
        }
        for(int i=1;i<=p;i++){
            for(int j=1;j<=(total>>1);j++){
                if(j-t[i]>=0){
                    dp[i][j]=max(dp[i-1][j],dp[i-1][j-t[i]]+t[i]);
                }
                else{
                    dp[i][j]=dp[i-1][j];
                }
            }
        }
        cout<<total-dp[p][total>>1]<<endl;
    }
    return 0;
}

typedef struct Node{
    int time,num;
}node;
node hw[30];

bool cmp(const Node &a, const Node &b){
    if(a.time>b.time) return true;
    else if(a.time==b.time) return a.num>b.num;
    else return false;
}

这里写图片描述
这里写图片描述
E题:

//LCS最长公共子序列
#include<iostream> 
#include<cstdio>
#define maxn 110
using namespace std;
int n,m;
char s[maxn],ss[maxn];
int dp[maxn][maxn];
void init(){
    for(int i=0;i<maxn;i++)
        for(int j=0;j<maxn;j++)
            dp[i][j]=0;
}
int max(int a,int b){
    return a>b?a:b;
}
int main(){
    init();
    cin>>n>>m;
    scanf("%s",s);
    scanf("%s",ss); 
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(s[i]==ss[j]){
                dp[i+1][j+1]=dp[i][j]+1;
            }
            else{
                dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]);
            }
        }
    }
    cout<<n+m-2*dp[n][m]<<endl;
    return 0;
}

这里写图片描述
这里写图片描述
G题
注意啊,是输入多组数据,要用while循环输入。。WA了两回。。orz

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int a,b,c;
int flag[10],hash[20];

int solve(int d){
    int temp[4];
    int p=0;
    memset(hash,0,sizeof(hash));
    if(d==1) hash[1]=hash[6]=1;
    else if(d==2) hash[2]=hash[5]=1;
    else if(d==3) hash[3]=hash[4]=1;
    int ans=0;
    for(int i=1;i<=6;i++){ 
        if(flag[i]==1 &&hash[i]==0){
            ans++;
        }
    }
    if(ans==3||ans==4) return d;
    else return 0;
} 


int main(){

    while(cin>>a>>b>>c){
        int p=0,q=0;
        memset(flag,0,sizeof(flag));
        memset(hash,0,sizeof(hash));

        for(int i=1;i<=6;i++){
            if(i==a||i==b||i==c){
                flag[i]=1;  //队长选的标记 
            }
        }

        //去打磨1,2,3面 
        int a1=solve(1);
        int a2=solve(2);
        int a3=solve(3);
        if(a1) cout<<a1<<endl;
        else if(a2) cout<<a2<<endl;
        else if(a3) cout<<a3<<endl;
        else
            cout<<"0"<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37360631/article/details/79948169
今日推荐