7,9wa,求解
查看原帖
7,9wa,求解
24065
邹榆冬楼主2021/1/23 11:14

感觉自己和tj思路差不多啊

#include<bits/stdc++.h>
using namespace std;

int n,c,sum,pos,ans;
struct wwq{
	int v,k;
}m[100];
int pl[100];
bool cmp(wwq a,wwq b){
	return a.v<b.v;
}

int main(){
	scanf("%d%d",&n,&c);
	for(int i=1;i<=n;i++){
		scanf("%d%d",&m[i].v,&m[i].k);
	}
	
	sort(m+1,m+n+1,cmp);
	pos=n+1;
	for(int i=1;i<=n;i++){
		if((c>m[i-1].v)&&(c<=m[i].v)){
			pos=i;break;
		}
	}
	
	for(int i=pos;i<=n;i++){
		ans+=m[i].k;
	}
	bool zuerst=1;
	while(true){
		int nc=c;bool flag=1;
		for(int i=1;i<=pos-1&&!zuerst;i++){
			if(!pl[i])continue;
			if(pl[i]>m[i].k){
				flag=0;
				break;
			}
		}
		if(flag&&!zuerst){
			ans++;
			for(int i=1;i<=pos-1;i++){
				m[i].k-=pl[i];
			} 
			nc=0;
			continue;
		}
		zuerst=0;
		memset(pl,0,sizeof(pl));
		for(int j=pos-1;j>=1;j--){
			if(!m[j].k)continue;
			int intdiv=nc/m[j].v;
			if(nc<m[j].v)break;
			if(intdiv<=m[j].k){
				pl[j]+=intdiv;
				nc-=intdiv*m[j].v;
				m[j].k-=intdiv;
				//break;
			}
			else{
				pl[j]+=m[j].k;
				nc-=m[j].k*m[j].v;
				m[j].k=0; 
			}
		}
		if(!nc)ans++;
		for(int j=1;j<=pos-1&&nc;j++){
			int intdiv=nc/m[j].v+1;
			if(m[j].k>=intdiv){
				m[j].k-=intdiv;
				pl[j]+=intdiv;
				nc=0;
				ans++;
				break;
			}
			nc-=m[j].k*m[j].v;
			pl[j]+=m[j].k;
			m[j].k=0;
		}
		if(nc>0)break;
	}
	
	printf("%d\n",ans);
	return 0;
} 
2021/1/23 11:14
加载中...