首页 > 代码库 > 10.27 noip模拟试题(moring)
10.27 noip模拟试题(moring)
WPS转word太丑了 凑合看喽
第二题
【题目描述】
给你两个日期,问这两个日期差了多少毫秒。
【输入格式】
两行,每行一个日期,日期格式保证为“YYYY-MM-DD hh:mm:ss ”这种形式。第二个日期时间一定比第一个日期时间要大两个日期的年份一定都是 21 世纪的年份。
【输出格式】
一行一个整数代表毫秒数。
【样例输入 1】
2000-01-01 00:00:00
2000-01-01 00:00:01
【样例输出 1】
1000
【样例输入 2】
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7
2000-01-01 00:00:00
2000-11-11 00:00:00
【样例输出 2】
27216000000
【样例解释】
从前有座山。
考场上写了一个多小时 还好写出来了....
要不就尴尬了2333
/*有点恶心....*/#include<iostream>#include<cstdio>#include<cstring>#define ll long longusing namespace std;ll nian1,nian2,yue1,yue2,tian1,tian2;ll shi1,shi2,fen1,fen2,miao1,miao2;ll now,pre;ll Mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};char s1[110],s2[110],c1[110],c2[110];ll Get1(char s[110]){//年 ll x=0; for(ll i=0;i<4;i++) x=x*10+s[i]-‘0‘; return x; }ll Get2(char s[110]){//月 ll x=0; for(ll i=5;i<7;i++) x=x*10+s[i]-‘0‘; return x; }ll Get3(char s[110]){//日 ll x=0; for(ll i=8;i<10;i++) x=x*10+s[i]-‘0‘; return x; }ll Get4(char s[110]){//时 ll x=0; for(ll i=0;i<2;i++) x=x*10+s[i]-‘0‘; return x; }ll Get5(char s[110]){//分 ll x=0; for(ll i=3;i<5;i++) x=x*10+s[i]-‘0‘; return x; }ll Get6(char s[110]){//秒 ll x=0; for(ll i=6;i<8;i++) x=x*10+s[i]-‘0‘; return x; }ll Is(ll x){ return (x%400==0)||(x%100&&x%4==0);}ll Nian(ll x){ if(Is(x))return 366; else return 365;}int main(){ freopen("two.in","r",stdin); freopen("two.out","w",stdout); scanf("%s%s%s%s",s1,s2,c1,c2); nian1=Get1(s1);yue1=Get2(s1);tian1=Get3(s1); nian2=Get1(c1);yue2=Get2(c1);tian2=Get3(c1); shi1=Get4(s2);fen1=Get5(s2);miao1=Get6(s2); shi2=Get4(c2);fen2=Get5(c2);miao2=Get6(c2); for(int i=2000;i<nian2;i++) now+=Nian(i); for(int i=1;i<yue2;i++) now+=Mon[i]; if(Is(nian2)&&yue2>2)now++; now+=tian2-1;now=now*24;//shi now+=shi2;now*=60;now+=fen2;// fen now*=60;now+=miao2;//miao for(int i=2000;i<nian1;i++) pre+=Nian(i); for(int i=1;i<yue1;i++) pre+=Mon[i]; if(Is(nian1)&&yue1>2)pre++; pre+=tian1-1;pre=pre*24;//shi pre+=shi1;pre*=60;pre+=fen1;// fen pre*=60;pre+=miao1;//miao cout<<(now-pre)*1000<<endl; return 0;}
死亡
【问题描述】
现在有?个位置可以打 sif,有? + 1个人在排队等着打 sif。现在告诉你前?个人每个人需要多长的时间打 sif,问你第? + 1个人什么时候才能打 sif。(前?个人必须按照顺序来)
【输入格式】
第一行两个整数?, ?如上所述。
接下来?行每行一个整数代表每个人所需要用的时间。
【输出格式】
一行一个整数表示答案。
【样例输入】
3 2
1
1
1
【样例输出】
1
【样例解释】
山里有座庙。
裸贪心
#include<cstdio>#include<queue>#define maxn 100010using namespace std;int n,m,c[maxn],mx,k;priority_queue<int,vector<int>,greater<int> >q;int init(){ int x=0,f=1;char s=getchar(); while(s<‘0‘||s>‘9‘){if(s==‘-‘)f=-1;s=getchar();} while(s>=‘0‘&&s<=‘9‘){x=x*10+s-‘0‘;s=getchar();} return x*f;}int main(){ freopen("death.in","r",stdin); freopen("death.out","w",stdout); n=init();m=init(); for(int i=1;i<=n;i++) c[i]=init(); for(int i=1;i<=m;i++) q.push(0); for(int i=1;i<=n+1;i++){ mx=q.top();q.pop(); q.push(mx+c[i]); if(i==n+1){ printf("%d\n",mx); break; } } return 0;}
凝视
【问题描述】
背包是个好东西,希望我也有。
给你一个二维的背包,它的体积是? × ?。现在你有一些大小为1 × 2和1 × 3的物品,每个物品有自己的价值。你希望往背包里面装一些物品,使得它们的价值和最大,问最大的价值和是多少。
【输入格式】
第一行一个整数?代表该测试点的数据组数。
对于每组数据,第一行有四个整数?, ?, ?1, ?2,其中?1, ?2分别代表大小为 1 × 2和大小为1 × 3的物品个数。
接下来一行有?1个数代表每个1 × 2物品的价值。接下来一行有?2个数代表每个1 × 3物品的价值。
【输出格式】
对于每组询问,输出能够达到的价值最大值。
【样例输入】
1
2 3 2 2
1 2
1 2
【样例输出】
4
【样例解释】
庙里有座山。
骗分没骗到 不粘了2333
正解很锻炼脑子2333
/*贪心.....不是dp(基于连通性的状丫dp)如果确定了选几个1*2 几个1*3就ok了然后枚举摆几个1*3 只要个数够 一定能全放开 然后Judge如果只放1*2的 最多剩下一个 或者0个先放1*3的 一样的结论 1*2的剩下1或0个剩下的空间可以算出来那么放几个1*2就能算出来 last/2小小的特盘 要是2*2 不能放1*3的*/#include<cstdio>#include<cstring>#include<algorithm>#define maxn 10010using namespace std;int T,n,m,n1,n2,s1,s2,ans,c1[maxn],c2[maxn];struct node{ int x,c; bool operator < (const node &a) const{ return c>a.c; }}p1[maxn],p2[maxn];int init(){ int x=0,f=1;char s=getchar(); while(s<‘0‘||s>‘9‘){if(s==‘-‘)f=-1;s=getchar();} while(s>=‘0‘&&s<=‘9‘){x=x*10+s-‘0‘;s=getchar();} return x*f;}void Cl(){ ans=0;c1[0]=0;c2[0]=0;}int min(int x,int y){ return x<y?x:y;}int main(){ freopen("eyesight.in","r",stdin); freopen("eyesight.out","w",stdout); T=init(); while(T--){ Cl(); n=init();m=init(); n1=init();n2=init(); for(int i=1;i<=n1;i++){ p1[i].x=2;p1[i].c=init(); } for(int i=1;i<=n2;i++){ p2[i].x=3;p2[i].c=init(); } sort(p1+1,p1+1+n1); sort(p2+1,p2+1+n2); for(int i=1;i<=n1;i++) c1[i]=c1[i-1]+p1[i].c; for(int i=1;i<=n2;i++) c2[i]=c2[i-1]+p2[i].c; if(n==2&&m==2){ s1=2;s2=0; ans=max(ans,c1[s1]+c2[s2]); } else { for(s2=0;s2*3<=n*m;s2++){ s1=n*m-s2*3;s1/=2; ans=max(ans,c1[min(s1,n1)]+c2[min(s2,n2)]);//取小 取小 取小 } } printf("%d\n",ans); } return 0;}
10.27 noip模拟试题(moring)