20200803 牛客多校赛

上菜

#include <iostream>
#include <set>
#include <iostream>
#include <cstring>
#include <queue>
#include <math.h>
#include <map>
#include <string>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=1e5+10;
int a[maxn],b[maxn],c[maxn]={0},d[maxn],out,n,flag,num;
set<int> s;
set<int> nums;
inline int read(){
    int x=0,f=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}
inline void sort(int a[],int n)
{
    int temp;
    for(int i=0;i<n-1;i++)
    {
        for(int j=0;j<n-i-1;j++)
        {
            if(a[j]<a[j+1])
            {
                temp=a[j+1];
                a[j+1]=a[j];
                a[j]=temp;
            }
        }
    }
}
int main()
{
    int t=read();
    for(int i=1;i<=t;i++)
    {
        int n=read(),min1=1e5+10,coun=0,sum=0,desk=n-1;
        for(int j=0;j<n;j++){
            c[j]=read();if(j>0)c[j]+=c[j-1];
//            if(c[j]>max1)max1=c[j];
//            if(c[j]<max1)c
        }
        for(int j=0;j<n;j++){
            int p=read();
            min1=a[j]=min(p,min1);
        }
        memcpy(d,c,sizeof(c));
        int temp;
        for(int j=0;j<n-1;j++)
        {
            for(int g=0;g<n-j-1;g++)
                if(d[g]>d[g+1])
                {
                    //cout<<d[g]<<" "<<d[g+1]<<endl;
                    temp=d[g+1];
                    d[g+1]=d[g];
                    d[g]=temp;
                    //cout<<d[g]<<" "<<d[g+1]<<endl;
                }
            //cout<<d[n-1-j]<<endl;
            for(int k=desk;k>=0;k--)
            {
                if(c[k]==d[n-1-j])
                {
                    if(a[k]!=coun){
                        sum+=c[k]*(a[k]-coun);
                        coun=a[k];
                        desk=k-1;
                    }
                    //cout<<sum<<endl;
                    break;
                }
            }
        }
        cout<<"Case #"<<i<<": "<<a[0]<<' '<<sum<<endl;
    }
    return 0;
}

  游戏

#include <iostream>
#include <set>
#include <iostream>
#include <cstring>
#include <queue>
#include <math.h>
#include <map>
#include <string>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=1e5+10;
int a[maxn],b[maxn],out,n,flag,num;
set<int> s;
set<int> nums;
inline int read(){
    int x=0,f=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}
inline void dfs(int c,int m)
{
    if(flag)
    {
        if(m==n)
		{
        	if(c>out)out=c;
        	if(out==num)flag=0;
        	//cout<<3<<endl;
        	return;
        }
        if(s.insert(a[m]).second)
        {
            dfs(c+1,m+1);s.erase(s.find(a[m]));
        //cout<<1<<endl;
            //cout<<' '<<a[m]<<endl;
        }
        //cout<<m<<endl;
        if(s.insert(b[m]).second)
        {
            dfs(c+1,m+1);s.erase(s.find(b[m]));
            //cout<<2<<endl;
        }
        dfs(c,m+1);
    }
}
inline void clean()
{
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    s.clear();
    nums.clear();
    out=0;
    flag=1;
}

int main()
{
    int t;
    t=read();
    for(int j=1;j<=t;j++)
    {
        n=read();
        clean();
        for(int i=0;i<n;i++)
        {
            a[i]=read();b[i]=read();
        }
        nums.insert(a,a+n-1);
        nums.insert(b,b+n-1);
        num=nums.size();
        dfs(0,0);
        cout<<"Case #"<<j<<": "<<out<<endl;
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/tabshh/p/13428172.html