傳送門
水的一批,還讓開o2了ios
就不寫了spa
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<queue> #include<stack> #include<vector> #include<map> #include<string> #include<cstring> using namespace std; inline int read() { char c = getchar(); int x = 0, f = 1; while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); } while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar(); return x * f; } int n, x; char s[5]; priority_queue<int,vector<int>,greater<int> > q; int main() { scanf("%d",&n); while(n--) { scanf("%s",s); if(s[0]=='i') { scanf("%d",&x); q.push(x); } else { printf("%d\n",q.top()); q.pop(); } } return 0; }
傳送門code
這題數據很是的水很是的水,打個很小的表就過了,咕咕咕htm
不過仍是要說一下正解的嘛blog
只須要用約數個數定理就好了,話說居然沒人百度?get
傳送門string
就是二分答案啊,多是題意不太清楚不過我又寫了注意的啊,就是一個建築工人能夠買多個禮物,可是不能多個建築工人買一個禮物,我不是寫在題目上了嗎(大霧)it
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<queue> #include<stack> #include<vector> #include<map> #include<string> #include<cstring> using namespace std; inline int read() { char c = getchar(); int x = 0, f = 1; while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); } while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar(); return x * f; } int n,m,a[100005],l,r,mid,s,t; bool yd; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); l=max(l,a[i]); r+=a[i]; //最少一我的買一個禮物買完,最多一我的把全部都買下來 } while(l<=r) { mid=(l+r)/2; s=mid-a[1]; t=m; yd=0; //s爲當前工人所剩的錢,t爲禮物數 for(int i=2;i<=n;i++) if(s>=a[i]) s-=a[i]; //若是能夠繼續買就繼續買 else if(t>0) s=mid-a[i],t--; //不然還要建築工人的話,換另外一個建築工人 else {yd=1; break;} //不然就不能 if(yd) l=mid+1; else r=mid-1; } printf("%d",l); return 0; }