模拟赛1029d1
第二题
【题目描述】
给你两个日期,问这两个日期差了多少毫秒。
【输入格式】
两行,每行一个日期,日期格式保证为“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
【样例解释】
从前有座山。
【数据范围与规定】
1相同。
2可能不同。
3只有秒数、分钟数可能不同。
4日一定相同。
6月 对于80%的数据,两个日期的年份一定相同。
对于100%的数据, 两个日期一定都是 21 世纪的某一天, 且第二个日期一定
大于等于第一个日期。
/*这是我做过的最恶心的模拟题,没有之一*/ #include<cstdio> #include<iostream> #define N 110 #define rn 31622400000LL #define pn 31536000000LL #define ll long long using namespace std; char c[N];ll n[3],y[3],r[3],s[3],f[3],m[3]; ll r1[13]={0,31,29,31,30,31,30,31,31,30,31,30,31}; ll r2[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; void init(ll num) { cin>>c; n[num]=(c[0]-'0')*1000+(c[1]-'0')*100+(c[2]-'0')*10+c[3]-'0'; y[num]=(c[5]-'0')*10+c[6]-'0'; r[num]=(c[8]-'0')*10+c[9]-'0'; cin>>c; s[num]=(c[0]-'0')*10+c[1]-'0'; f[num]=(c[3]-'0')*10+c[4]-'0'; m[num]=(c[6]-'0')*10+c[7]-'0'; } bool run(ll x) { if(x%100==0) { if(x%400==0)return true; return false; } else if(x%4==0)return true; return false; } ll work(ll num) { ll p=0; if(run(n[num])) { for(ll i=1;i<y[num];i++)p+=r1[i]*86400000; p+=(r[num]-1)*86400000+s[num]*3600000+f[num]*60000+m[num]*1000; } else { for(ll i=1;i<y[num];i++)p+=r2[i]*86400000; p+=(r[num]-1)*86400000+s[num]*3600000+f[num]*60000+m[num]*1000; } return p; } int main() { //freopen("jh.txt","r",stdin); freopen("two.in","r",stdin); freopen("two.out","w",stdout); init(1);init(2); ll ans=0; for(ll i=n[1]+1;i<n[2];i++) if(run(i))ans+=rn; else ans+=pn; if(run(n[1]))ans+=rn;else ans+=pn; ans-=work(1); ans+=work(2); if(n[1]==n[2]) { if(run(n[1]))ans-=rn;else ans-=pn; } cout<<ans; return 0; }
死亡
【问题描述】
现在有?个位置可以打 sif,有? +1个人在排队等着打 sif。现在告诉你 个人每个人需要多长的时间打 sif,问你第? +1个人什么时候才能打 sif。 (前?
个人必须按照顺序来)
【输入格式】
第一行两个整数?,?如上所述。
接下来?行每行一个整数代表每个人所需要用的时间。
【输出格式】
一行一个整数表示答案。
【样例输入】
3 2
1
1
1
【样例输出】
1
【样例解释】
山里有座庙。
【数据规模与约定】
对于100%的数据,每个人所需用的时间不超过10 5 。
测试点 ? ? 测试点 ? ?
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
/*很简单的贪心,一直取最小就可以了*/ #include<cstdio> #include<iostream> #include<queue> #define N 100010 #define ll long long #define INF 1000000000000LL using namespace std; ll a[N],b[N],n,m; struct node { ll sum; bool operator < (node tmp)const { return sum>tmp.sum; } }; priority_queue<node> q; int main() { //freopen("jh.txt","r",stdin); freopen("death.in","r",stdin); freopen("death.out","w",stdout); cin>>n>>m; for(ll i=1;i<=n;i++) cin>>a[i]; for(ll i=1;i<=m;i++) { node s;s.sum=0; q.push(s); } for(ll i=1;i<=n;i++) { node s=q.top();q.pop(); s.sum+=a[i];q.push(s); } cout<<q.top().sum; return 0; }
凝视
【问题描述】
背包是个好东西,希望我也有。
给你一个二维的背包,它的体积是? × ?。现在你有一些大小为1× 2和1×
3的物品,每个物品有自己的价值。你希望往背包里面装一些物品,使得它们的
价值和最大,问最大的价值和是多少。
【输入格式】
第一行一个整数?代表该测试点的数据组数。
对于每组数据,第一行有四个整数?,?,? 1 ,? 2 ,其中? 1 ,? 2 分别代表大小为
1× 2和大小为1 × 3的物品个数。
1 × 2 接下来一行有? 2 个数代表每个1 × 3物品的价值。
【输出格式】
对于每组询问,输出能够达到的价值最大值。
【样例输入】
1
2 3 2 2
1 2
1 2
【样例输出】
4
【样例解释】
庙里有座山。
【数据规模与约定】
2,? 1 ,? 2 ≤ 100。
70%的数据,?,? ≤ 100,? 1 ,? 2 ≤ 2000。
对于100%的数据,1 ≤ ? ≤ 10,1 ≤ ?,? ≤ 500,0 ≤ ? 1 ,? 2 ≤ 10000。
/* 这道题想通了就不难 有分析可以得出,当我们用若干个1*3的方格放进二维背包时,剩下的区域用1*2的 方格铺,最后至多有一个方格没铺完,所以我们可以枚举铺了几个1*3的方格,那么 用的1*2的方格数是可以O(1)地算出来的。 这里要特判一种情况,当我们铺一个2*2的背包时,尽管4>3,但是也不能铺下1*3的 方格,以此类推,当n=2,m%3=2时,铺到最后都会出现这种情况。 */ #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #define N 100010 using namespace std; int n,m,n1,n2,a1[N],a2[N],s1[N],s2[N]; int read() { int num=0,flag=1;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')flag=-1;c=getchar();} while(c>='0'&&c<='9'){num=num*10+c-'0';c=getchar();} return num*flag; } bool cmp(int a,int b) { return a>b; } int main() { int T;scanf("%d",&T); while(T--) { memset(s1,0,sizeof(s1)); memset(s2,0,sizeof(s2)); scanf("%d%d%d%d",&n,&m,&n1,&n2); if(n>m)swap(n,m); for(int i=1;i<=n1;i++) scanf("%d",&a1[i]); for(int i=1;i<=n2;i++) scanf("%d",&a2[i]); sort(a1+1,a1+n1+1,cmp); sort(a2+1,a2+n2+1,cmp); for(int i=1;i<=n1;i++)s1[i]=s1[i-1]+a1[i]; for(int i=1;i<=n2;i++)s2[i]=s2[i-1]+a2[i]; int ans=0; for(int i=0;i<=n2;i++) { if(i*3>n*m)break; int j=(n*m-i*3)/2; ans=max(ans,s2[i]+s1[j]); if(j>n1)ans=max(ans,s2[i]+s1[n1]); if(n==2&&m%3==2&&j==2)break; } printf("%d\n",ans); } return 0; }