感觉自己和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;
}