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

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

(能枚举的就不要思考)

#include 
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<

 

B:

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

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

#include 
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& 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;
  	vectora;
  	for(int i=1;i<=9;i++)cin>>x,a.push_back(x);
  	cout<

C:

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

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

#include 
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& potatoNum, vector >& connectRoad) {
    // write code here
    //cout<y)swap(x,y);
    	add(x,y,1);
    	du[y]++;
	}
//	cout<<" -  "<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[id])id=i;
	string ans;
	vectorv;
	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;
  	vectorpotatoNum;
  	int n,m;
  	cin>>n>>m;
  	vector > 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"<


 

你可能感兴趣的:(网络赛,面试算法题)