Codeforces Round #278 (Div. 2)
A直接暴力好了。
1 #include<bits/stdc++.h> 2 typedef long long ll; 3 using namespace std; 4 5 int pan(ll x) 6 { 7 while (x) 8 { 9 if (x%10==8) return 1; 10 x/=10; 11 } 12 return 0; 13 } 14 15 int main() 16 { 17 ll n; 18 cin>>n; 19 for (int i=1;i<=10000;i++) 20 if (pan(abs(n+i))) 21 { 22 cout<<i; 23 return 0; 24 } 25 return 0; 26 }
B:处理起来比较蛮烦,或则我比较懒。
大概思路是:先判n==4
2:n==0,预设定一个数。
3:N==1,可以用数学算出来;
N==2&&N==3的情况比较难讨论。但是ai<=500;看到直接暴力的思路;
C:暴力即可。
我们知道所有值都在100以内。所以我们可以暴力攻击和防御值买多少,然后算HP。因为HP可能买很多。
这样循环数不会很多。
1 #include<bits/stdc++.h> 2 typedef long long ll; 3 using namespace std; 4 5 int hpy,atky,defy; 6 int hpm,atkm,defm; 7 8 9 10 int pan(int b,int c) 11 { 12 13 int tatky=atky+b; 14 int tdefy=defy+c; 15 if (tatky<=defm) return -1; 16 17 int tmp=tatky-defm; 18 19 int ti=hpm/tmp; 20 if (hpm%tmp) ti++; 21 22 if (atkm<=tdefy) return 0; 23 24 tmp=atkm-tdefy; 25 26 if (ti*tmp<hpy) return 0; 27 return ti*tmp-hpy+1; 28 } 29 30 31 int main() 32 { 33 34 int h,a,d; 35 cin>>hpy>>atky>>defy; 36 cin>>hpm>>atkm>>defm; 37 cin>>h>>a>>d; 38 39 int ans=1<<30; 40 41 42 for (int j=0;j<4000;j++) 43 for (int k=0;k<4000;k++) 44 { 45 if (pan(j,k)==-1) continue; 46 ans=min(ans,pan(j,k)*h+a*j+d*k); 47 } 48 49 cout<<ans<<endl; 50 return 0; 51 }
D:思路很多:线段树,单调队列。
我看到的一种做法。。。
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int a[123456]; 5 int n,L,s; 6 int flag=1; 7 int main() 8 { 9 int left,right; 10 int ans=0; 11 cin>>n>>s>>L; 12 int last=0; 13 for (int i=0;i<n;i++) cin>>a[i]; 14 15 int pos=0; 16 for (;pos<n;pos++) 17 { 18 int maxm,minm; 19 int cnt=1; 20 maxm=minm=a[pos]; 21 right=pos+1; 22 while (right<n) 23 { 24 maxm=max(maxm,a[right ]); 25 minm=min(minm,a[right ]); 26 if (maxm-minm<=s) cnt++; 27 else break; 28 right++; 29 } 30 right--; 31 32 maxm=minm=a[pos]; 33 left=pos-1; 34 while (left>=last) 35 { 36 maxm=max(maxm,a[left ]); 37 minm=min(minm,a[left ]); 38 if (maxm-minm<=s) cnt++; 39 else break; 40 left--; 41 } 42 left++; 43 if (cnt<L) 44 { 45 flag=0; 46 break; 47 } 48 ans++; 49 last=left+L; 50 pos=right; 51 } 52 53 if (flag==0) ans=-1; 54 cout<<ans; 55 return 0; 56 }
http://www.cnblogs.com/AOQNRMGYXLMV/p/4116052.html。
这里有讲解。
然后我再分析一下
7 2 2
1 3 1 2 4 1 2
样例:
先把1 3 1 2放入第一组。
last的值是3(下标从0开始);
下次循环时可以在left到last中再找,就是4,2两个数一组。
随性Code