牛客编程巅峰赛S1第4场 - 黄金&钻石 ABC

A:直接枚举每盘放几个即可。

(能枚举的就不要思考)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
const double PI= acos(-1.0);
const int M = 1e5+7;
/*
int head[M],cnt=1;
void init(){cnt=1,memset(head,0,sizeof(head));}
struct EDGE{int to,nxt,w;}ee[M*2];
void add(int x,int y,int w){ee[++cnt].nxt=head[x],ee[cnt].w=w,ee[cnt].to=y,head[x]=cnt;}
*/
int solve(int n, int a, int b) {
        // write code here
        if(a>b)swap(a,b);
        for(int i=a;i>=1;i--)
        	if(a/i+b/i>=n)return i;
    }
int main()
{
	ios::sync_with_stdio(false);
  	cin.tie(0);
  	int n,a,b;
  	cin>>n>>a>>b;
  	cout<<solve(n,a,b)<<endl;
	return 0;
}

B:

显然:数位越多,数字越大,所以先尽量让数字位数最多。(设为mx)

然后从首位开始确定数字,首位越大越好。在满足可以放mx位数的情况下,让首位数字尽量大

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
const double PI= acos(-1.0);
const int M = 1e5+7;
/*
int head[M],cnt=1;
void init(){cnt=1,memset(head,0,sizeof(head));}
struct EDGE{int to,nxt,w;}ee[M*2];
void add(int x,int y,int w){ee[++cnt].nxt=head[x],ee[cnt].w=w,ee[cnt].to=y,head[x]=cnt;}
*/
string solve(int n, vector<int>& a) {
        // write code here
        string ans;
        int mx=0,id=0;
        for(int i=0;i<9;i++)
        	mx=max(mx,n/a[i]);
        if(mx==0)
        {
        	ans+="-1";
        	return ans;
		}
        for(int i=0;i<9;i++)
        	if(n/a[i]==mx)id=i;
		int nw=n;
		for(int i=1;i<=mx;i++)
		{
			for(int j=8;j>=0;j--)
			{
				if(nw-a[j]>=(mx-i)*a[id])
				{
					ans+=('0'+j+1);
					nw-=a[j];
					break;
				}
			}
		}
		return ans;
    }
int main()
{
	ios::sync_with_stdio(false);
  	cin.tie(0);
  	int n,x;
  	cin>>n;
  	vector<int>a;
  	for(int i=1;i<=9;i++)cin>>x,a.push_back(x);
  	cout<<solve(n,a)<<endl;
	return 0;
}
/*
2
9 11 1 12 5 8 9 10 6
*/

C:

一个简单的图上DP,直接拓扑序dp即可。。

比赛时把二维vector输入弄错了。。咋交都是wa,。,这样没有自测。。太难受了。不然就top10了

#include <bits/stdc++.h>
using namespace std;

int head[100007],cnt=1;
struct EDGE{int to,nxt,w;}ee[100007*2];
void add(int x,int y,int w){ee[++cnt].nxt=head[x],ee[cnt].w=w,ee[cnt].to=y,head[x]=cnt;}
int a[100007],du[100007];
int pre[100007],vs[100007],nm[100007];
string digSum(vector<int>& potatoNum, vector<vector<int> >& connectRoad) {
    // write code here
    //cout<<connectRoad.size()<<endl;
    cnt=1,memset(head,0,sizeof(head));
    memset(du,0,sizeof(du));memset(vs,0,sizeof(vs));
    memset(pre,-1,sizeof(pre));memset(nm,0,sizeof(nm));
  //  cout<<connectRoad.size()<<"oko"<<endl;
    for(int i=0;i<connectRoad.size();i++)
    {
    //	cout<<i<<" - ";
    	int x=connectRoad[i][0],y=connectRoad[i][1];
    	if(x>y)swap(x,y);
    	add(x,y,1);
    	du[y]++;
	}
//	cout<<" -  "<<endl;
	for(int i=0;i<potatoNum.size();i++)a[i+1]=nm[i+1]=potatoNum[i];
	int n=potatoNum.size();
	queue<int>q;
	while(q.size())q.pop();
	for(int i=0;i<=n;i++)if(du[i]==0)q.push(i);
	while(q.size())
	{
		int x=q.front();q.pop();
		for(int i=head[x];i;i=ee[i].nxt)
		{
			int y=ee[i].to;
			du[y]--;
			if(nm[y]<nm[x]+a[y]){
				nm[y]=nm[x]+a[y];
				pre[y]=x;
			}
			if(du[y]==0)q.push(y);
		}
	}
	int id=1;
	for(int i=1;i<=n;i++)
		if(nm[i]>nm[id])id=i;
	string ans;
	vector<int>v;
	int tp=id;
	while(tp!=-1)
	{
		v.push_back(tp);
		tp=pre[tp];
	}
	for(int i=v.size()-1;i>0;i--)
	ans+=to_string(v[i]),ans+='-';
	ans+=to_string(v[i]);
	return ans;
}
int main()
{
	ios::sync_with_stdio(false);
  	cin.tie(0);
  	int x,y;
  	vector<int>potatoNum;
  	int n,m;
  	cin>>n>>m;
  	vector<vector<int> > connectRoad(7);
  	for(int i=1;i<=n;i++)cin>>x,potatoNum.push_back(x);
  	int ct=0;
  	for(int i=1;i<=m;i++)cin>>x>>y,connectRoad[ct].push_back(x),connectRoad[ct++].push_back(y);
 // 	cout<<"oko"<<endl;
	  cout<<digSum(potatoNum,connectRoad)<<endl;
	return 0;
}
/*
6 7
11 10 20 5 4 5
1 2
1 4
2 4
3 4
4 5
4 6
5 6
*/


 

猜你喜欢

转载自blog.csdn.net/bjfu170203101/article/details/107436859