ACM-ICPC北京赛区(2017)网络赛1【模拟+枚举+数组操作】
题目1 : Visiting Peking University
描述
Ming is going to travel for n days and the date of these days can be represented by n integers: 0, 1, 2, …, n-1. He plans to spend m consecutive days(2 ≤ m ≤ n)in Beijing. During these m days, he intends to use the first day and another day to visit Peking university. Before he made his plan, Ming investigated on the number of tourists who would be waiting in line to enter Peking university during his n-day trip, and the results could be represented by an integer sequence p[i] (0 ≤ i ≤ n-1, p[i] represents the number of waiting tourists on day i). To save time, he hopes to choose two certain dates a and b to visit PKU(0 ≤ a < b ≤ n-1), which makes p[a] + p[b] as small as possible.
Unfortunately, Ming comes to know that traffic control will be taking place in Beijing on some days during his n-day trip, and he won’t be able to visit any place in Beijing, including PKU, on a traffic control day. Ming loves Beijing and he wants to make sure that m days can be used to visit interesting places in Beijing. So Ming made a decision: spending k (m ≤ k ≤ n) consecutive days in Beijing is also acceptable if there are k - m traffic control days among those k days. Under this complicated situation, he doesn’t know how to make the best schedule. Please write a program to help Ming determine the best dates of the two days to visit Peking University. Data guarantees a unique solution.
输入
There are no more than 20 test cases.
For each test case:
The first line contains two integers, above mentioned n and m (2 ≤ n ≤ 100, 2 ≤ m ≤ n).
The second line contains n integers, above mentioned p[0] , p[1] , … p[n-1]. (0 ≤ p[i] ≤ 1000, i = 0 ... n-1)
The third line is an integer q (0 ≤ q ≤ n), representing the total number of traffic control days during the n-day trip, followed by q integers representing the dates of these days.
输出
One line, including two integers a and b, representing the best dates for visiting PKU.
- 样例输入
-
7 3 6 9 10 1 0 8 35 3 5 6 2 4 2 10 11 1 2 1 2
- 样例输出
-
0 3 1 3
【题意】:题意是一人去旅游n天,在北京待连续的m天,他想去参观PKU,他知道这n天参观排队的人数,但是有q天交通管制,哪都去不了。所以他决定待K天,但是有要求,在前K天中,只要有K~M天是交通管制时间,他可以在连续的m天区间内选择任意两天参观,问最少排队人数是多少,注意排队人数的下标是0~n-1,但管制天数是1—n,最后输出这两天(下标)。
【分析】:重点是枚举起点天。第一组数据中2、6、5天交通管制,将它们从数组删去。剩下6(0) 9(1) 1(3) 0(4).三天的组合—>6 9 1中选2天 or 9 1 0 中选2天。求和后比较取最小值。(注意每个情况的第一天是必须选的)。则必须选择第0或1天作为游览的第一天,否则无法保证总共游览m=3天。若选第0天开始,则最佳方案是第0和第3天,排队总人数是6+1=7。若选第1天作为开始,则最佳方案是第1和第4天,9+0=9。所以最终的方案是第0和第3天。
【代码】:#include<bits/stdc++.h> using namespace std; const int maxn = 105; #define inf 0x3f3f3f3f struct node { int re,id; }b[maxn]; int main() { int n,m,k; int a[maxn]; int q,x; int vis[maxn]; while(~scanf("%d%d",&n,&m)) { k=0; memset(vis,0,sizeof(vis)); for(int i=0; i<n; i++) { scanf("%d",&a[i]); } scanf("%d",&q); for(int i=0; i<q; i++) { scanf("%d",&x); vis[x]=1; } for(int i=0;i<n;i++) { if(!vis[i]) { b[k].re=a[i]; b[k++].id=i; //k++; } } int minn=inf,l=0,r=0;// for(int i=0;i+m<=k;i++) { int x=b[i].re; for(int j=1;j<m;j++) { if(b[i+j].re+x < minn) { minn=b[i+j].re+x; l=b[i].id; r=b[i+j].id; } } } printf("%d %d\n",l,r); } }