D - Garbage Disposal
Description
Enough is enough. Too many times it happened that Vasya forgot to dispose of garbage and his apartment stank afterwards. Now he wants to create a garbage disposal plan and stick to it.
For each of next n
days Vasya knows ai — number of units of garbage he will produce on the i-th day. Each unit of garbage must be disposed of either on the day it was produced or on the next day. Vasya disposes of garbage by putting it inside a bag and dropping the bag into a garbage container. Each bag can contain up to k
units of garbage. It is allowed to compose and drop multiple bags into a garbage container in a single day.
Being economical, Vasya wants to use as few bags as possible. You are to compute the minimum number of bags Vasya needs to dispose of all of his garbage for the given n
days. No garbage should be left after the n
-th day.
Input
The first line of the input contains two integers n
and k (1≤n≤2⋅105,1≤k≤109) — number of days to consider and bag's capacity. The second line contains n space separated integers ai (0≤ai≤109) — the number of units of garbage produced on the i
-th day.
Output
Output a single integer — the minimum number of bags Vasya needs to dispose of all garbage. Each unit of garbage should be disposed on the day it was produced or on the next day. No garbage can be left after the n
-th day. In a day it is allowed to compose and drop multiple bags.
Sample Input
3 2
3 2 1
3
5 1
1000000000 1000000000 1000000000 1000000000 1000000000
5000000000
3 2
1 0 1
2
4 4
2 8 4 1
4
题意:
有n天,第i天有a[i]个垃圾,每天的垃圾最多能留到第二天扔,每个垃圾口袋最多装k个垃圾,问,最少用多少个垃圾口袋能把所有的垃圾装完。
思路:
把每天的垃圾数分两种,一种是刚好能用垃圾口袋装下的;一种是还剩余的垃圾,这个时候,把剩余的垃圾留到第二天去处理,将第二天的垃圾数减掉(k-剩余的),让第一天剩余的垃圾和第二天里的垃圾凑成一个垃圾口袋
如果,第二天的垃圾数减去第一天需要的后小于0,这个时候就让第二天的垃圾数等于0。然后输出垃圾口袋数就好
注意ans要开long long
1 #include<algorithm> 2 #include<cstdio> 3 #include<iostream> 4 using namespace std; 5 int main(){ 6 int n,k; 7 while(~scanf("%d %d",&n,&k)) { 8 int a[200005]; 9 for(int i=1;i<=n;i++) 10 scanf("%d",&a[i]); 11 long long ans=0,t=0; 12 for(int i=1;i<=n;i++) { 13 ans+=a[i]/k;//当天刚好能装袋的垃圾 14 t=a[i]%k;//剩余没能当天装袋的垃圾 15 if(t){//如果剩余的垃圾>0 16 17 a[i+1]-=k-t;//将第二天的垃圾数减去第一天剩余装袋的垃圾所需要的垃圾 18 if(a[i+1]<0)//如果相见之后垃圾数<0 19 a[i+1]=0;//让垃圾数=0 20 ans++;//垃圾口袋数++ 21 } 22 } 23 printf("%lld ",ans); 24 } 25 return 0; 26 }
H - BerOS File Suggestion
Description
Polycarp is working on a new operating system called BerOS. He asks you to help with implementation of a file suggestion feature.
There are n
characters, inclusive. All file names are unique.
The file suggestion feature handles queries, each represented by a string s
. For each query s it should count number of files containing s as a substring (i.e. some continuous segment of characters in a file name equals s) and suggest any such file name.
For example, if file names are "read.me", "hosts", "ops", and "beros.18", and the query is "os", the number of matched files is 2
(two file names contain "os" as a substring) and suggested file name can be either "hosts" or "beros.18".
Input
The first line of the input contains integer n
) — the total number of files.
The following n
lines contain file names, one per line. The i-th line contains fi — the name of the i-th file. Each file name contains between 1 and 8
characters, inclusive. File names contain only lowercase Latin letters, digits and dot characters ('.'). Any sequence of valid characters can be a file name (for example, in BerOS ".", ".." and "..." are valid file names). All file names are unique.
The following line contains integer q
(1≤q≤50000) — the total number of queries.
The following q
lines contain queries s1,s2,…,sq, one per line. Each sj has length between 1 and 8characters, inclusive. It contains only lowercase Latin letters, digits and dot characters ('.').
Output
Print q
, where
- cj
- -th query,
- tj
- -th query. If there is no such file, print a single character '-' instead. If there are multiple matched files, print any.
Sample Input
4
test
contests
test.
.test
6
ts
.
st.
.test
contes.
st
1 contests
2 test.
1 test.
1 .test
0 -
4 .test
MAP是个好东西
题意:
给你n个字符串,再给你q次查询,问你每一次查询的字符串是n个字符串中多少个字符串的子串,并随机输出其中一个原串
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<map> 5 #include<iostream> 6 using namespace std; 7 map<string,int> strr; 8 map<string,string> sstr; 9 int main() 10 { 11 int n; 12 while(~scanf("%d",&n)) { 13 while(n--) { 14 string a; 15 cin>>a; 16 map<string,int> outrepeat;//去重,防止一个字符串中,同样的子串出现不止一次 17 for(int i=0;i<a.size();i++) { 18 for(int j=1;j<=a.size();j++) { 19 string b; 20 b=a.substr(i,j); 21 if(outrepeat[b]==0) {//去重 22 strr[b]++;//该子串在n个原串中出现的次数 23 sstr[b]=a;//记录该子串所属的原串 24 outrepeat[b]=1; 25 } 26 } 27 } 28 } 29 int m; 30 scanf("%d",&m); 31 while(m--) { 32 string c; 33 cin>>c; 34 if(strr[c]>0) 35 cout<<strr[c]<<" "<<sstr[c]<<endl; 36 else 37 cout<<"0 -"<<endl; 38 } 39 } 40 return 0; 41 }