zoukankan      html  css  js  c++  java
  • hpu第五届acm比赛

    vijos
    P1211生日日数
     

    描述

    CCC老师的生日是YY年MM月DD日,他想知道自己出生后第一万天纪念日的日期(出生日算第0天)。

    格式

    输入格式

    从文件的第一行分别读入YY,MM,DD其中1949<=YY<=2006,日期绝对合法。

    输出格式

    输出文件只有一行,即CCC老师生日第一万天以后的日期,格式为 “Y-M-D”。

    样例1

    样例输入1[复制]

     
    1979 4 16

    样例输出1[复制]

     
    2006-9-1
    题解:坑点在,2月29,1月1,12月31,
    代码:
    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    #define mem(x,y) memset(x,y,sizeof(x))
    #define yea(x) (x%400==0||(x%4==0&&x%100!=0))
    int m[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    int getd(int nn,int yy,int rr){
    	int d=0;
    	if(yea(nn))m[2]=29;
    	for(int i=1;i<yy;i++)d+=m[i];
    	d+=rr;
    	m[2]=28;
    //	printf("%d
    ",d); 
    	return d;
    }
    int main(){
    	int N,nn,yy,rr;
    	while(~scanf("%d%d%d",&nn,&yy,&rr)){
    		int d=10000;
    		m[2]=28;
    		if(yea(nn))d-=(366-getd(nn,yy,rr));
    		else d-=(365-getd(nn,yy,rr));
    		int y,mon,r;
    		for(y=nn+1;d>=365;y++){
    			if(yea(y))d-=366;
    			else d-=365;
    		}
    		if(yea(y))m[2]=29;
    		if(d==0){
    			y--;
    			mon=12;r=31;
    		}
    		else for(mon=1;mon<13;mon++){
    			if(d>m[mon])d-=m[mon];
    			else if(d==m[mon]){
    				r=m[mon];
    				break;
    			}
    			else{
    				r=d;
    				break;
    			}
    		}
    		printf("%d-%d-%d
    ",y,mon,r);
    	}
    	return 0;
    }
    

      

    1136: HH生病了

    时间限制: 1 Sec  内存限制: 128 MB 提交: 332  解决: 96 [提交][状态][讨论版]

    题目描述

    HH很不幸的感冒了,只好去校医院去挂盐水,挂盐水的时候,他发现盐水滴起来有规律,先是滴一滴,停一下;然后滴二滴,停一 下;再滴三滴,停一下...,现在有一个问题:这瓶盐水一共有VUL毫升,每一滴是D毫升,每一滴的速度是一秒(假设最后一滴不到D毫升,则花费的时间也 算一秒),停一下的时间也是一秒这瓶水什么时候能挂完呢?

    输入

    输入数据占一行,由VUL和D组成,其中0< D< VUL< 5000。

    输出

    请输出挂完盐水需要的时间。

    样例输入

    10 1

    样例输出

    13


    代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 #define mem(x,y) memset(x,y,sizeof(x))
     7 using namespace std;
     8 int main(){
     9     double v,d;
    10     while(~scanf("%lf%lf",&v,&d)){
    11         int sec=0;
    12         for(int i=1;v>0;i++){
    13             if(v>i*d){
    14                 sec+=i+1;
    15                 v-=i*d;
    16             }
    17             else{
    18                 sec+=(int)(0.99999999+v/d);
    19                 v=0;
    20                 break;
    21             }
    22         }
    23         printf("%d
    ",sec);
    24     }
    25     return 0;
    26 }

    HH的随机数

    时间限制: 1 Sec  内存限制: 128 MB 提交: 465  解决: 71 [提交][状态][讨论版]

    题目描述

    HH想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。

    输入

    有2行,第1行为1个正整数,表示所生成的随机数的个数:  N  第2行有N个用空格隔开的正整数,为所产生的随机数。 

    输出

    也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。

    样例输入

    10 20 40 32 67 40 20 89 300 400 15

    样例输出

    8 15 20 32 40 67 89 300 400


    题解:。。。结尾不能有换行。。。

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #define mem(x,y) memset(x,y,sizeof(x))
    using namespace std;
    int main(){
    	int N,m[110],vis[110];
    	while(~scanf("%d",&N)){
    	//	mem(vis,0);
    		for(int i=0;i<N;i++)scanf("%d",m+i);
    		sort(m,m+N);
    		int k=unique(m,m+N)-m;
    		/*int k=N;
    		for(int i=1;i<N;i++){
    			if(m[i]==m[i-1])k--,vis[i]=1;
    		}*/
    		printf("%d
    ",k);
    		/*for(int i=0;i<N;i++){
    			if(vis[i])continue;
    			if(i)printf(" ");
    			printf("%d",m[i]);
    		}*/
    		for(int i=0;i<k;i++){
    			if(i)printf(" ");
    			printf("%d",m[i]);
    		}
    	//	puts("");
    	}
    	return 0;
    	}
    

      

    HH实习

    时间限制: 1 Sec  内存限制: 128 MB 提交: 51  解决: 35 [提交][状态][讨论版]

    题目描述

    这学期到了十五周了,HH突然要去实训中心实习了,想到要拿着钳子,锯子什么的,头就有点大了,因为它挺好玩的,但是,也是很累的,看着学弟坐在机房悠闲地敲着代码,HH学长决定要让他们好好忙忙,这道题就是为了你们而出的,学弟们,加油! 问题很简单,只是需要动手就够了,要求是,给你n米长的钢筋,钢筋大家都知道吧?就是一根钢条,钢条大家都知道吧?不知道的回家问麻麻,目的很简单,让你自己动手把这一根很长的钢筋切成M段,保证他们中的任意三段都不能构成三角形,听起来会感觉乱乱的,其实我要的答案很简单,就是你能把这根钢筋截成多少条,条数要最多,还有就是长度不能少于1米。 简单吧,大家抓紧时间AC吧。

    输入

    第一行输入一个T,接下来T行,每行有一个数N(4<=N<=1000000);

    输出

    输出占一行,对应每个N输出最多的条数M

    样例输入

    2 7 144

    样例输出

    4 10


    题解:斐波那契,由于不少于1米,所以就从1开始,三角形不满足条件a+b<=c,可知当等于c的时候耗材最小,所以就是个斐波那契;

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #define mem(x,y) memset(x,y,sizeof(x))
    using namespace std;
    int dp[10010];
    int main(){
    	int T,N;
    	mem(dp,0);
    	dp[1]=1;dp[2]=2;
    	for(int i=3;;i++){
    		dp[i]=dp[i-1]+dp[i-2];
    		if(dp[i]>1000000)break;
    	}
    	scanf("%d",&T);
    	while(T--){
    		scanf("%d",&N);
    		int i;
    		for(i=1;;i++){
    			if(N<dp[i])break;
    			N-=dp[i];
    		}
    		printf("%d
    ",i);
    	}
    	return 0;
    	}
    

      

     HH的米5

    时间限制: 1 Sec  内存限制: 128 MB 提交: 93  解决: 28 [提交][状态][讨论版]

    题目描述

    HH新买了一台手机小米5,他给自己的新手机设置了一个高端大气上档次的屏幕保护锁(其实就是一个9宫锁屏),保护锁有一个特点,就是需要一笔画下来才能解锁,HH就在想,如果给定N个点和M条边,那么该图是否可以通过一笔将该图画下来呢?他想请你帮他写一个程序,判断一个图是否能够用一笔画下来。 规定,所有的边都只能画一次,不能重复画。

    输入

    第一行只有一个正整数T(T<=10)表示测试数据的组数。 每组测试数据的第一行有两个正整数N,M(N<=1000,M<=2000),分别表示这个画中有多少个顶点和多少条连线。(点的编号从1到N) 随后的M行,每行有两个正整数A,B(0<a,b<n),表示编号为a和b的两点之间有连线。< p="">

    输出

    如果存在符合条件的连线,则输出"Yes", 如果不存在符合条件的连线,输出"No"。

    注意输出不包含引号!

    样例输入

    2 4 3 1 2 1 3 1 4 4 5 1 2 2 3 1 3 1 4 3 4

    样例输出

    No Yes


    题解:欧拉回路,这个不回到源点

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #define mem(x,y) memset(x,y,sizeof(x))
    using namespace std;
    const int MAXN=1010;
    int pre[MAXN],usd[MAXN];
    void initial(){
    	mem(pre,0);mem(usd,0);
    }
    int find(int x){
    	return pre[x]==x?x:find(pre[x]);
    }
    void merge(int a,int b){
    	if(!pre[a])pre[a]=a;
    	if(!pre[b])pre[b]=b;
    	int f1,f2;
    	f1=find(a);f2=find(b);
    	if(f1!=f2)pre[f2]=f1;
    }
    int main(){
    	int T,N,M;
    	scanf("%d",&T);
    	while(T--){
    		initial();
    		scanf("%d%d",&N,&M);
    		int a,b;
    		while(M--){
    			scanf("%d%d",&a,&b);
    			merge(a,b);
    			usd[a]++;usd[b]++;
    		}
    		int flot=1,cnt=0,temp=0;
    		for(int i=1;i<=N;i++){
    			if(usd[i]&1)temp++;
    			if(pre[i]==i||pre[i]==0)cnt++;
    		}
    	//	printf("***%d %d
    ",temp,cnt);
    		if(cnt!=1||temp!=2)flot=0;
    		if(flot)puts("Yes");
    		else puts("No");
    	}
    	return 0;
    	}
    

      

  • 相关阅读:
    python数据结构树和二叉树简介
    python双向链表的实现
    Python单向链表的实现
    栈和队列数据结构的基本概念及其相关的Python实现
    模型融合目录
    算法汇总目录
    一个完整的机器学习目录
    python基础-面向对象opp
    Python random模块
    python-字符串前面添加u,r,b的含义
  • 原文地址:https://www.cnblogs.com/handsomecui/p/4981772.html
Copyright © 2011-2022 走看看