题目链接:

E1:http://codeforces.com/contest/1108/problem/E1

E2:http://codeforces.com/contest/1108/problem/E2

题目大意:

给你n个数,然后给你m个区间,每一个区间代表将给定的n个数这个区间内都减去1,每个区间最多使用一次。然后问你使用哪些区间能够使得这n个数中最大数和最小的差值最大?

首先对于E1:这么小的数据不暴力搞啥??直接问枚举就完事了,每一次枚举的时候保持一个数不变,假设当前的数是最大的,然后其他的只要是不包含这个数的区间,都减去,这样就能让最小的那个位置尽可能的小了。

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 # define ll long long
 4 # define inf 0x3f3f3f3f
 5 const int maxn = 400+100;
 6 int a[maxn],b[maxn],sto[maxn];
 7 struct node
 8 {
 9     int le;
10     int ri;
11 } q[maxn];
12 int main()
13 {
14     int n,m;
15     scanf("%d %d",&n,&m);
16     for(int i=1; i<=n; i++)
17     {
18         scanf("%d",&a[i]);
19     }
20     for(int i=1; i<=m; i++)
21     {
22         scanf("%d %d",&q[i].le,&q[i].ri);
23     }
24     int maxx=-inf,id=0;
25     for(int i=1; i<=n; i++)
26     {
27         int t1=-inf,t2=inf;
28         for(int j=1; j<=n; j++)
29         {
30             b[j]=a[j];
31         }
32         for(int j=1; j<=m; j++)
33         {
34             if(i>=q[j].le&&i<=q[j].ri)
35                 continue;
36             for(int k=q[j].le; k<=q[j].ri; k++)
37             {
38                 b[k]-=1;
39             }
40         }
41         for(int j=1; j<=n; j++)
42         {
43             t1=max(t1,b[j]);
44             t2=min(t2,b[j]);
45         }
46         if(t1-t2>maxx)
47         {
48             maxx=t1-t2;
49             id=i;
50         }
51     }
52   //  cout<<m<<endl;
53     printf("%d\n",maxx);
54     int num=0;
55   //  cout<<1<<" "<<num<<endl;
56     for(int i=1; i<=m; i++)
57     {
58         if(id>=q[i].le&&id<=q[i].ri)
59             continue;
60           //  cout<<1<<endl;
61         sto[++num]=i;
62     }
63   //  cout<<2<<" "<<num<<endl;
64     printf("%d\n",num);
65     for(int i=1; i<=num; i++)
66     {
67         if(i==1)
68             printf("%d",sto[i]);
69         else
70             printf(" %d",sto[i]);
71     }
72     printf("\n");
73     return 0;
74 }
View Code

相关文章: