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

原文地址:https://www.cnblogs.com/forgot93/p/4120049.html