悲剧的开始~~~~
竞赛时间:????年??月??日??:??-??:??
题目名称 |
第二题 |
死亡 |
凝视 |
名称 |
two |
death |
eyesight |
输入 |
two.in |
death.in |
eyesight.in |
输出 |
two.out |
death.out |
eyesight.out |
每个测试点时限 |
1 秒 |
1 秒 |
1 秒 |
内存限制 |
512MB |
512MB |
512MB |
测试点数目 |
10 |
10 |
10 |
每个测试点分值 |
10 |
10 |
10 |
是否有部分分 |
无 |
无 |
无 |
题目类型 |
传统 |
传统 |
传统 |
注意事项(请务必仔细阅读):
第二题
【题目描述】
给你两个日期,问这两个日期差了多少毫秒。
【输入格式】
两行,每行一个日期,日期格式保证为“YYYY-MM-DD hh:mm:ss ”这种形式。第二个日期时间一定比第一个日期时间要大两个日期的年份一定都是 21 世纪的年份。
【输出格式】
一行一个整数代表毫秒数。
【样例输入 1】
2000-01-01 00:00:00
2000-01-01 00:00:01
【样例输出 1】
1000
【样例输入 2】
2000-01-01 00:00:00
2000-11-11 00:00:00
【样例输出 2】
27216000000
【样例解释】
从前有座山。
【数据范围与规定】
对于10%的数据,两个日期相同。
对于20%的数据,两个日期只有秒数可能不同。
对于30%的数据,两个日期只有秒数、分钟数可能不同。对于40%的数据,两个日期的年月日一定相同。
对于60%的数据,两个日期的年月一定相同。对于80%的数据,两个日期的年份一定相同。
对于100%的数据,两个日期一定都是 21 世纪的某一天,且第二个日期一定大于等于第一个日期。
把一天当做12小时~~搞成SB也没A..
可以算出每个年月日到2001刚开始的秒,两个做差再加上时秒分的差
1 #include <algorithm> 2 #include <cstdio> 3 4 #define LL long long 5 #define dayss 86400 6 7 using namespace std; 8 9 int agy,agm,agd,agh,agmm,agss,noy,nom,nod,noh,nomm,noss; 10 int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; 11 LL ans,numm; 12 char c; 13 14 int main() 15 { 16 freopen("two.in","r",stdin); 17 freopen("two.out","w",stdout); 18 scanf("%d-%d-%d %d:%d:%d",&agy,&agm,&agd,&agh,&agmm,&agss); 19 scanf("%d-%d-%d %d:%d:%d",&noy,&nom,&nod,&noh,&nomm,&noss); 20 for(int i=2000;i<noy;i++) 21 { 22 if((i%400==0)||(i%4==0&&i%100!=0)) ans+=366*dayss; 23 else ans+=(LL)365*dayss; 24 } 25 for(int i=2000;i<agy;i++) 26 { 27 if((i%400==0)||(i%4==0&&i%100!=0)) ans-=366*dayss; 28 else ans-=(LL)365*dayss; 29 } int nf=0,af=0; 30 if((noy%400==0)||(noy%4==0&&noy%100!=0)) nf=1; 31 if((agy%400==0)||(agy%4==0&&agy%100!=0)) af=1; 32 for(int i=1;i<nom;i++) 33 if(nf&&i==2) ans+=(LL)29*dayss; 34 else ans+=(LL)month[i]*dayss; 35 for(int i=1;i<agm;i++) 36 if(af&&i==2) ans-=(LL)29*dayss; 37 else ans-=(LL)month[i]*dayss; 38 ans+=(LL)nod*dayss; ans-=(LL)agd*dayss; 39 ans+=(LL)(noss-agss+(nomm-agmm)*60+(noh-agh)*3600); 40 if(ans) printf("%I64d000",ans); else puts("0"); 41 return 0; 42 }
死亡
【问题描述】
现在有 个位置可以打 sif,有 + 1个人在排队等着打 sif。现在告诉你前个人每个人需要多长的时间打 sif,问你第 + 1个人什么时候才能打 sif。(前个人必须按照顺序来)
【输入格式】
第一行两个整数 , 如上所述。
接下来 行每行一个整数代表每个人所需要用的时间。
【输出格式】
一行一个整数表示答案。
【样例输入】
3 2
1
1
1
【样例输出】
1
【样例解释】
山里有座庙。
【数据规模与约定】
对于100%的数据,每个人所需用的时间不超过105。
测试点 |
测试点 |
||||
1 |
10 |
10 |
1 |
5000 |
500 |
2 |
20 |
10 |
2 |
100000 |
5000 |
3 |
50 |
10 |
3 |
100000 |
10000 |
4 |
1000 |
500 |
4 |
100000 |
20000 |
5 |
2000 |
500 |
5 |
100000 |
50000 |
用小根堆维护最短时间
1 #include <algorithm> 2 #include <cstdio> 3 #include <queue> 4 5 #define LL long long 6 7 using namespace std; 8 9 priority_queue<LL,vector<LL>,greater<LL> >que; 10 const int N(1e6+15); 11 LL n,m,tim[N],temp; 12 13 int main() 14 { 15 freopen("death.in","r",stdin); 16 freopen("death.out","w",stdout); 17 scanf("%lld%lld",&n,&m); 18 for(int i=1;i<=n;i++) scanf("%lld",tim+i); 19 for(int i=1;i<=m;i++) que.push(tim[i]); 20 for(int i=m+1;i<=n;i++) 21 { 22 temp+=que.top(); 23 que.pop(); 24 que.push(tim[i]+temp); 25 } 26 printf("%lld",que.top()); 27 return 0; 28 }
凝视
【问题描述 】
背包是个好东西,希望我也有。
给你一个二维的背包,它的体积是n ×m 。现在你有一些大小为1 × 2和1 × 3的物品,每个物品有自己的价值。你希望往背包里面装一些物品,使得它们的价值和最大,问最大的价值和是多少。
【输入格式】
第一行一个整数t 代表该测试点的数据组数。
对于每组数据,第一行有四个整数n ,m ,n 1,n 2,其中 1, 2分别代表大小为 1 × 2和大小为1 × 3的物品个数。
接下来一行有 1个数代表每个1 × 2物品的价值。接下来一行有 2个数代表每个1 × 3物品的价值。
【输出格式】
对于每组询问,输出能够达到的价值最大值。
【样例输入】
1
2 3 2 2
1 2
1 2
【样例输出】
4
【样例解释】
庙里有座山。
【数据规模与约定】
对于20%的数据, n,m ≤ 10, n1,n 2 ≤ 100。对于70%的数据, n,m ≤ 100, n1, n2 ≤ 2000。
对于100%的数据,1 ≤ t≤ 10,1 ≤ n ,m ≤ 500,0 ≤ n1, n2 ≤ 10000。
法一:连通块状压DP~~~呵呵呵
法二:贪心——处理出每个物品的价值前缀和(降序) 每举放1*3的物品的面积,计算出1*2 和 1*3 的物品的前缀和编号,每次计算最大值
1 #include <algorithm> 2 #include <cstring> 3 #include <cstdio> 4 5 using namespace std; 6 7 const int N(10000+15); 8 int t,n,m,n1,n2,val1[N],val2[N]; 9 10 int sum1[N],sum2[N],ans; 11 bool cmp(int a,int b) 12 { 13 return a>b; 14 } 15 16 int main() 17 { 18 freopen("eyesight.in","r",stdin); 19 freopen("eyesight.out","w",stdout); 20 scanf("%d",&t); 21 for(;t--;) 22 { 23 scanf("%d%d%d%d",&n,&m,&n1,&n2); ans=0; 24 for(int i=1;i<=n1;i++) scanf("%d",val1+i); 25 for(int i=1;i<=n2;i++) scanf("%d",val2+i); 26 sort(val1+1,val1+n1+1,cmp); 27 sort(val2+1,val2+n2+1,cmp); 28 for(int i=1;i<=n1;i++) sum1[i]=sum1[i-1]+val1[i]; 29 for(int i=1;i<=n2;i++) sum2[i]=sum2[i-1]+val2[i]; 30 int temp=n*m; 31 if((n==2||m==2)&&(n%3==2&&m%3==2)) temp-=4; 32 for(int i=0,j;i<=temp;i+=3) 33 { 34 j=(n*m-i)>>1; 35 ans=max(ans,sum2[min(i/3,n2)]+sum1[min(j,n1)]); 36 } 37 printf("%d ",ans); 38 } 39 return 0; 40 }