標籤:style blog http color os io for 資料
B. Little Dima and Equation
思路:本來前兩題都很快做出來的,然後覺得ranting應該可以增加了。然後覺得代碼沒問題了,又想到了一組cha人的資料,然後就鎖了,然後剛鎖就被別人cha了看了代碼才發現尼瑪忘了判斷小於10^9了,然後C反正想了好多種方法都不會就沒心情了,就這樣rating又降了
#pragma comment(linker, "/STACK:1024000000,1024000000")#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<map>#include<queue>#include<set>#include<cmath>#include<bitset>#define mem(a,b) memset(a,b,sizeof(a))#define lson i<<1,l,mid#define rson i<<1|1,mid+1,r#define llson j<<1,l,mid#define rrson j<<1|1,mid+1,r#define INF 6#define maxn 10005typedef long long ll;typedef unsigned long long ull;using namespace std;int i,j;ll k,a,b,c,sum,n,m;double aa,bb,cc,sum1;string s,ss,str;ll abc(ll x){ ll sum=0; while(x) { sum+=x%10; x/=10; } return sum;}ll go(ll f){ ll sum=1; for(int i=0;i<a;i++) sum*=f; return sum;}ll nn[100010],mm=1000000000;int main(){ cin>>a>>b>>c; for(i=1;i<82;i++) { sum=go(i)*b+c; n=sum; if(abc(sum)==(ll)i) nn[j++]=sum; } printf("%d\n",j); for(i=0;i<j;i++) { if(i!=j-1) cout<<nn[i]<<' '; else cout<<nn[i]<<endl; } return 0;}
C. Present
思路:這題一直想不出來,剛看了下題解,一看就明白了
而且題解裡面說了,像這種求最小的最大一般都是二分,唉……自己太弱了根本沒想到啊,因為又是區間的更加沒有想到了。
從頭往前掃,第一個不足x的肯定需要增加x-a[i],那麼肯定它作為連續的一段的最左邊,那麼把這一段的a[i]都加上x-a[i],繼續掃描第一個不足x的,就這麼簡單。。。
但是搞了一晚上才過,尼瑪,原來二分的時候把r=INF了,然後因為可能要加上a[i]然後就超了int了,但是我全部換成long long 竟然不對,老是在第十五個範例WA,不知道怎麼回事,改了又交了好多發依然WA不止,後面還是改成r=1100000000才行,這個加上a[i]正好在int邊界那,所以才A。暈……
#pragma comment(linker, "/STACK:1024000000,1024000000")#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<map>#include<queue>#include<set>#include<cmath>#include<bitset>#define mem(a,b) memset(a,b,sizeof(a))#define lson i<<1,l,mid#define rson i<<1|1,mid+1,r#define llson j<<1,l,mid#define rrson j<<1|1,mid+1,r#define INF 0x7fffffff#define maxn 200005typedef long long ll;typedef unsigned long long ull;using namespace std;int n,m,w,a[maxn],b[maxn];bool check(ll mid){ int sum=0,cnt=0; mem(b,0); for(int i=0;i<n;i++) { sum+=b[i]; if(sum+a[i]<mid) { cnt+=mid-(sum+a[i]); if(cnt>m) return false; b[i+w]-=mid-(sum+a[i]); sum+=mid-(sum+a[i]); } } return true;}int binary(){ int l=1,r=1100000000,mid; while(l<=r) { mid=(l+r)>>1; if(check(mid)) l=mid+1; else r=mid-1; } return r;}int main(){ cin>>n>>m>>w; for(int i=0;i<n;i++) cin>>a[i]; cout<<binary()<<endl; return 0;}