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
*/