打怪升级 一开始有N个怪物;主角有K个能力;只有K个能力都击败怪物才能斩杀怪物并获得K个能力的增值;问最多能杀几个怪物;
做法:
用优先队列把怪物能力装进去;能力小放前面;
最重要的是数据量要用读入挂才能过;(读入挂太神奇了!!)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 2049 Accepted Submission(s): 601
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll mod=998244353; const int maxn=1e5+90; const ll inf=0x3f3f3f3f3f3f; namespace IO{ #define BUF_SIZE 100000 #define OUT_SIZE 100000 #define ll long long //fread->read bool IOerror=0; inline char nc(){ static char buf[BUF_SIZE],*p1=buf+BUF_SIZE,*pend=buf+BUF_SIZE; if (p1==pend){ p1=buf; pend=buf+fread(buf,1,BUF_SIZE,stdin); if (pend==p1){IOerror=1;return -1;} //{printf("IO error!\n");system("pause");for (;;);exit(0);} } return *p1++; } inline bool blank(char ch){return ch==‘ ‘||ch==‘\n‘||ch==‘\r‘||ch==‘\t‘;} inline void read(int &x){ bool sign=0; char ch=nc(); x=0; for (;blank(ch);ch=nc()); if (IOerror)return; if (ch==‘-‘)sign=1,ch=nc(); for (;ch>=‘0‘&&ch<=‘9‘;ch=nc())x=x*10+ch-‘0‘; if (sign)x=-x; } inline void read(ll &x){ bool sign=0; char ch=nc(); x=0; for (;blank(ch);ch=nc()); if (IOerror)return; if (ch==‘-‘)sign=1,ch=nc(); for (;ch>=‘0‘&&ch<=‘9‘;ch=nc())x=x*10+ch-‘0‘; if (sign)x=-x; } inline void read(double &x){ bool sign=0; char ch=nc(); x=0; for (;blank(ch);ch=nc()); if (IOerror)return; if (ch==‘-‘)sign=1,ch=nc(); for (;ch>=‘0‘&&ch<=‘9‘;ch=nc())x=x*10+ch-‘0‘; if (ch==‘.‘){ double tmp=1; ch=nc(); for (;ch>=‘0‘&&ch<=‘9‘;ch=nc())tmp/=10.0,x+=tmp*(ch-‘0‘); } if (sign)x=-x; } inline void read(char *s){ char ch=nc(); for (;blank(ch);ch=nc()); if (IOerror)return; for (;!blank(ch)&&!IOerror;ch=nc())*s++=ch; *s=0; } inline void read(char &c){ for (c=nc();blank(c);c=nc()); if (IOerror){c=-1;return;} } //fwrite->write struct Ostream_fwrite{ char *buf,*p1,*pend; Ostream_fwrite(){buf=new char[BUF_SIZE];p1=buf;pend=buf+BUF_SIZE;} void out(char ch){ if (p1==pend){ fwrite(buf,1,BUF_SIZE,stdout);p1=buf; } *p1++=ch; } void print(int x){ static char s[15],*s1;s1=s; if (!x)*s1++=‘0‘;if (x<0)out(‘-‘),x=-x; while(x)*s1++=x%10+‘0‘,x/=10; while(s1--!=s)out(*s1); } void println(int x){ static char s[15],*s1;s1=s; if (!x)*s1++=‘0‘;if (x<0)out(‘-‘),x=-x; while(x)*s1++=x%10+‘0‘,x/=10; while(s1--!=s)out(*s1); out(‘\n‘); } void print(ll x){ static char s[25],*s1;s1=s; if (!x)*s1++=‘0‘;if (x<0)out(‘-‘),x=-x; while(x)*s1++=x%10+‘0‘,x/=10; while(s1--!=s)out(*s1); } void println(ll x){ static char s[25],*s1;s1=s; if (!x)*s1++=‘0‘;if (x<0)out(‘-‘),x=-x; while(x)*s1++=x%10+‘0‘,x/=10; while(s1--!=s)out(*s1); out(‘\n‘); } void print(double x,int y){ static ll mul[]={1,10,100,1000,10000,100000,1000000,10000000,100000000, 1000000000,10000000000LL,100000000000LL,1000000000000LL,10000000000000LL, 100000000000000LL,1000000000000000LL,10000000000000000LL,100000000000000000LL}; if (x<-1e-12)out(‘-‘),x=-x;x*=mul[y]; ll x1=(ll)floor(x); if (x-floor(x)>=0.5)++x1; ll x2=x1/mul[y],x3=x1-x2*mul[y]; print(x2); if (y>0){out(‘.‘); for (size_t i=1;i<y&&x3*mul[i]<mul[y];out(‘0‘),++i); print(x3);} } void println(double x,int y){print(x,y);out(‘\n‘);} void print(char *s){while (*s)out(*s++);} void println(char *s){while (*s)out(*s++);out(‘\n‘);} void flush(){if (p1!=buf){fwrite(buf,1,p1-buf,stdout);p1=buf;}} ~Ostream_fwrite(){flush();} }Ostream; inline void print(int x){Ostream.print(x);} inline void println(int x){Ostream.println(x);} inline void print(char x){Ostream.out(x);} inline void println(char x){Ostream.out(x);Ostream.out(‘\n‘);} inline void print(ll x){Ostream.print(x);} inline void println(ll x){Ostream.println(x);} inline void print(double x,int y){Ostream.print(x,y);} inline void println(double x,int y){Ostream.println(x,y);} inline void print(char *s){Ostream.print(s);} inline void println(char *s){Ostream.println(s);} inline void println(){Ostream.out(‘\n‘);} inline void flush(){Ostream.flush();} #undef ll #undef OUT_SIZE #undef BUF_SIZE }; int v[10]; int value[maxn][10]; int b[maxn][10]; struct node{ int id; int num; node(int id,int num){this->id=id;this->num=num;} bool friend operator<(node a,node b){ return a.num>b.num; } }; priority_queue<node>pq[10]; void init(){ for(int i=1;i<=5;i++){ while(!pq[i].empty())pq[i].pop(); } } int n,k,t; int main() { // std::ios::sync_with_stdio(false); //std::cin.tie(0); IO::read(t); while(t--){ init(); IO::read(n);IO::read(k); for(int i=1;i<=k;i++)IO::read(v[i]); for(int i=1;i<=n;i++){ for(int j=1;j<=k;j++){ IO::read(value[i][j]); } pq[1].push(node(i,value[i][1])); for(int j=1;j<=k;j++)IO::read(b[i][j]); } int ans=0,ans1=-1; while(ans!=ans1){ ans1=ans; for(int i=1;i<k;i++){ while(!pq[i].empty()&&pq[i].top().num<=v[i]){ int now=pq[i].top().id; pq[i].pop(); pq[i+1].push(node(now,value[now][i+1])); } } while(!pq[k].empty()&&pq[k].top().num<=v[k]){ ans++; int now=pq[k].top().id; pq[k].pop(); for(int i=1;i<=k;i++)v[i]+=b[now][i]; } } IO::println(ans); for(int i=1;i<=k;i++){ if(i!=1)IO::print(‘ ‘); IO::print(v[i]); } IO::print(‘\n‘); } return 0; }
HDU 6396 Swordsman --------2018 Multi-University Training Contest 7 (模拟+读入挂)
原文:https://www.cnblogs.com/luowentao/p/9478962.html