弱鸡儿长乐爆零旅Day1

T1魔法照片

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct rec{
    int num;
    int d;
}a[50100];
int e[20];
bool cmp(const rec x,const rec y)
{
    return x.d==y.d?x.num<y.num: x.d>y.d;
}
int main()
{
    //freopen("mphone.in","r",stdin);
    //freopen("mphone.out","w",stdout);
    int n,k;
    scanf("%d %d",&n,&k);
    for(int i=1;i<=10;i++)
        scanf("%d",&e[i]);
    
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i].d);
        a[i].num=i;
    }
    sort(a+1,a+1+n,cmp);
    for(int i=1;i<=n;i++)
    {
        a[i].d+=e[(i-1)%10+1];
    }
    sort(a+1,a+1+n,cmp);
    for(int i=1;i<=k;i++)
        printf("%d ",a[i].num);
    return 0;
}

 

 T2  个人所得税

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
double ans=0;
struct rec{
    int mon[13];
}a[50002];
void tax1(double x)
{
    if(x<0)
        return ;
    else if(x<=500)
    {
        ans+=(x*0.05);return ;
    }
    else if(x<=2000)
    {
        ans+=25+(x-500)*0.1;return ;
    }
    else if(x<=5000)
    {
        ans+=25+150+(x-2000)*0.15;return ;
    }
    else if(x<=20000)
    {
        ans+=25+150+450+(x-5000)*0.20;return ;
    }
    else if(x<=40000)
    {
        ans+=25+150+450+3000+(x-20000)*0.25;return ;
    }
    else if(x<=60000)
    {
        ans+=25+150+450+3000+5000+(x-40000)*0.3;return ;
    }
    else if(x<=80000)
    {
        ans+=25+150+450+3000+5000+6000+(x-60000)*0.35;return ;
    }
    else if(x<=100000)
    {
        ans+=25+150+450+3000+5000+6000+7000+(x-80000)*0.4;return ;
    }
    else if(x>100000)
    {
        ans+=25+150+450+3000+5000+6000+7000+8000+(x-100000)*0.45;return ;
    }
}
void tax2(double x)
{
    if(x<0)
        return ;
    else if(x<=20000)
    {
        ans+=x*0.2;
        return ;
    }
    else if(x<=50000)
    {
        ans+=4000+(x-20000)*0.3;
        return ;
    }
    else if(x>50000)
    {
        ans+=4000+9000+(x-50000)*0.4;
        return ;
    }
}
int main()
{
    freopen("tax.in","r",stdin);
    freopen("tax.out","w",stdout);
    string s1,s2;
    int num;
    double mon;
    int n;
    scanf("%d",&n);
    while(cin>>s1&&s1[0]!='#')
    {
        scanf("%d",&num);
        cin>>s2;
        scanf("%lf",&mon);
        int m=0;
        //cout<<s1[0]<<" a"<<endl;
        if(s1[0]=='P')
        {
            for(int i=0;i<=s2.length();i++)
            {
                if(s2[i]=='/')
                    break;
                m=m*10+s2[i]-'0';
            }
            a[num].mon[m]+=mon;
        }
            
        else if(s1[0]=='I')
        {
            if(mon<=4000)
            {
                mon-=800;
            }
            else 
                mon=mon*0.8;
            tax2(mon);
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=12;j++)
        {
            tax1(a[i].mon[j]-800);
        }
    }
    printf("%.2lf",ans);
}

 注意事项:第一种税收按月份算 记得当月的要累加(拿到题目一定要仔细读题分析数据qaq)

T3  最大子段和

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const ll INF=0x3f3f3f3f3f3f3f3f,N=100005; 
ll n,a[N],Left[N],Right[N],sum1[N],sum2[N];
//sum用来计算前缀和、后缀和
int main()
{
    ll ans1=-INF,ans2=-INF,tot=0;
    scanf("%lld",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
        tot+=a[i];
        ans1=max(ans1,tot);
        if(tot<0)
            tot=0;
    }
    memset(Left,0xcf,sizeof(Left));
    memset(Right,0xcf,sizeof(Right));
    for(int i=1;i<=n;i++)//计算前缀和 更新左子串最大值 
    {
        sum1[i]=sum1[i-1]+a[i];
        Left[i]=max(Left[i-1],sum1[i]);
    }
    for(int i=n;i>=1;i--) //计算后缀和 更新右子串最大值 
    {
        sum2[i]=sum2[i+1]+a[i];
        Right[i]=max(Right[i+1],sum2[i]);
    }
    for(int i=1;i<n;i++)//枚举断点
    {
        ans2=max(ans2,Left[i]+Right[i+1]);
    }
    printf("%lld",max(ans1,ans2));
    return 0;
}

 

 T4 最小差值生成树

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct rec{
    int x,y,z;
}edge[5050];
int n,m,fa[210],ans=0x7f7f7f7f;
void clear()
{
    for(int i=1;i<=n;i++)
        fa[i]=i;
}
int get(int x)
{
    return fa[x]==x?x:fa[x]=get(fa[x]);
}
bool cmp(const rec &x,const rec &y)
{
    return x.z<y.z;
}
void calc()
{
    for(int i=1;i<=m;i++)
    {
        int Max=edge[i].z;
        int cnt=1;
        clear();
        fa[edge[i].x]=edge[i].y;
        for(int j=i+1;j<=m;j++)
        {
            int f1=get(edge[j].x),f2=get(edge[j].y);
            if(f1==f2)
                continue;
            else{
                fa[f1]=f2;
                cnt++;
                Max=max(Max,edge[j].z);
            }
            if(cnt==n-1)//一棵n个节点的树有n-1条边
            {
                break;
            }
        }
        if(cnt==n-1)
        {
            ans=min(ans,Max-edge[i].z);
        }
            
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        edge[i].x=x,edge[i].y=y,edge[i].z=z;
    }
    sort(edge+1,edge+1+m,cmp);//先按边的长度从小到大排列
    calc(); 
    printf("%d",ans);
    return 0;
}

友链 https://www.luogu.org/blog/zbwer/post-2019-boom-1

posted @ 2019-07-22 22:00  Markill  阅读(109)  评论(0编辑  收藏  举报