题目链接:
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 }