首页 > 代码库 > Codeforces Round #278 (Div. 2)

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 }
View Code

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     }
View Code

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 }
View Code

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两个数一组。

Codeforces Round #278 (Div. 2)