2018 Multi-University Training Contest 7----hdu 6396 Swordsman (IO输入挂)

点击链接

 

题意:

          给一个人的k个属性,,然后给n只怪的k个属性,当主角所有属性高于怪的时候能将怪的属性吞噬并杀死

          求主角能杀多少只怪并且属性最高到多少

 

思路:

         因为题目的属性最多为五,用一个一维优先队列,队列里面放怪的单个属性进行排序,这里我们需要用到pair绑定属性和怪的id,优先队列里面我们可以直接判断能打死的怪,遍历k遍之后,如果有怪被打了k次,说明所有属性均高于怪,这时候就能把怪吞噬了,如果有怪被吞噬,那么主角又可以去找之前打不过的怪来砍,当主角砍不死任何一只怪的时候,就表示主角已经满级了

 

 

注意:因为题目输入比较大,所以会被输入卡时间,这里需要用到IO输入挂才能过。因为是文件输入,所以自己测试的时候需要自己输入一下

 

    cin.tie(0);
    cout.tie(0);

这两个在这里并没有用到,用这个可以提升cin和cout的输入输出速度

代码:

#include<bits/stdc++.h>
#define P pair<int,int>
using namespace std;

P zz;
namespace IO {
	const int MX = 4e7; //1e7 占用内存 11000kb
	char buf[MX];
	int c, sz;
	void begin() {
		c = 0;
		sz = fread(buf, 1, MX, stdin);//一次性全部读入
	}
	inline bool read(int &t) {
		while (c < sz && buf[c] != '-' && (buf[c] < '0' || buf[c] > '9')) c++;
		if (c >= sz) return false;//若读完整个缓冲块则退出
		bool flag = 0;
		if(buf[c] == '-') flag = 1, c++;
		for(t = 0; c < sz && '0' <= buf[c] && buf[c] <= '9'; c++) t = t * 10 + buf[c] - '0';
		if(flag) t = -t;
		return true;
	}
}
priority_queue<P,vector<P>,greater<P> >a[6];
int man[6];
int rankup[100005][6];
int boold[100005];
int main() {
	cin.tie(0);
	cout.tie(0);
	int t;
	IO::begin();
	IO::read(t);
//	scanf("%d",&t);
	while(t--) {
		int n,k;
		memset(boold,0,sizeof(boold));
		IO::read(n);
		IO::read(k);
//		scanf("%d %d",&n,&k);
		for(int i=1; i<=k; i++) {
			IO::read(man[i]);
//			scanf("%d",&man[i]);
		}
		for(int i=1; i<=k; i++) {
			while(!a[i].empty()) {
				a[i].pop();
			}
		}
		for(int i=1; i<=n; i++) {
			for(int j=1; j<=k; j++) {
				int x;
//				scanf("%d",&x);
				IO::read(x);
				zz.first=x;
				zz.second=i;
				a[j].push(zz);
			}
			for(int j=1; j<=k; j++) {
				IO::read(rankup[i][j]);
//				scanf("%d",&rankup[i][j]);
			}
		}
		int ans=0;
		int mark;
		while(1){
			mark=0;
			for(int i=1;i<=k;i++){
				while(!a[i].empty()){
					zz=a[i].top();
					if(zz.first<=man[i]){
						a[i].pop();
						boold[zz.second]++;
						if(boold[zz.second]==k){
							for(int j=1;j<=k;j++){
								man[j]+=rankup[zz.second][j];
							}
							ans++;
							mark=1;
						}
					}
					else{
						break;
					}
				}
			}
			if(!mark)
					break;
		}
		cout<<ans<<endl;
		for(int i=1; i<=k; i++) {
			if(i!=1) {
				cout<<" ";
			}
			cout<<man[i];
		}
		puts("");

	}









}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值