Welcome, Guest! Sign Up RSS

Clever Space

Friday, 11.22.2024
Main » 2013 » October » 11 » [模拟赛NOIP2010]摆数字游戏
6:56 AM
[模拟赛NOIP2010]摆数字游戏

这个贪心写起来好麻烦

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<set>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
#include<iostream>
#include<string>
#include<cmath>
#define N 5010
#define FOR(i,a,b) for(i=(a);i<=(b);i++)
#define ROF(i,a,b) for(i=(a);i>=(b);i--)
typedef long long LL;
using namespace std;
struct node{int d,p;};
int cmp(node a,node b){return a.d<b.d;}
node P[N];
string st;
int n,k;
void doit1()
{
  int w=n/P[0].d;
  int y=n-P[0].d*w;
  st="";
  int i,j;
  FOR(i,1,w) st+=('0'+P[0].p);
  int maxp=0,pos;
  FOR(i,0,w-1)
  {
    pos=-1;
    FOR(j,1,k)
     if ((P[j].d-P[0].d<=y)&&(P[j].p>P[0].p)) {maxp=P[j].p;pos=j;}
    if (pos==-1) break;
    y-=(P[pos].d-P[0].d);
    st[i]=('0'+maxp);
  }
}
void doit2()
{
  int w=n/P[0].d;
  w--;
  int tot=P[0].d*w+P[1].d;
  while (tot>n&&w)
  {
    w--;
    tot=P[0].d*w+P[1].d;
  }
  int y=n-tot;
  int i,j;
  int maxp=0,pos;
  if (w)
  {
    st='0'+P[1].p;
    FOR(i,1,w) st+='0';
    FOR(i,0,w)
    {
      int tt1=(i==0?P[1].p:P[0].p);
      int tt2=(i==0?P[1].d:P[0].d);
      pos=-1;
      FOR(j,1,k)
       if ((P[j].d-tt2<=y)&&(P[j].p>tt1)) {maxp=P[j].p;pos=j;}
      if (pos==-1) break;
      y-=(P[pos].d-tt2);
      st[i]=('0'+maxp);
    }
  }else st="0";
}
int main()
{
  cin>>n>>k;
  int i;
  P[k+1].d=2E9;
  FOR(i,0,k) 
  {
    cin>>P[i].d;
    P[i].p=i;
  }
  sort(P,P+1+k,cmp);
  if (P[0].p==0) doit2();
  else doit1();
  cout<<st<<endl;
}

Views: 450 | Added by: dhy0077 | Rating: 0.0/0
Total comments: 0
Only registered users can add comments.
[ Sign Up | Login ]