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"<