zoukankan      html  css  js  c++  java
  • 2015编程之美资格赛

    三道水题了。

    题目1 : 2月29日

    时间限制:2000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期)。

    只有闰年有2月29日,满足以下一个条件的年份为闰年:

    1. 年份能被4整除但不能被100整除

    2. 年份能被400整除

    输入

    第一行为一个整数T,表示数据组数。

    之后每组数据包含两行。每一行格式为"month day, year",表示一个日期。month为{"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November" , "December"}中的一个字符串。day与year为两个数字。

    数据保证给定的日期合法且第一个日期早于或等于第二个日期。

    输出

    对于每组数据输出一行,形如"Case #X: Y"。X为数据组数,从1开始,Y为答案。

    数据范围

    1 ≤ T ≤ 550

    小数据:

    2000 ≤ year ≤ 3000

    大数据:

    2000 ≤ year ≤ 2×109

    样例输入
    4
    January 12, 2012
    March 19, 2012
    August 12, 2899
    August 12, 2901
    August 12, 2000
    August 12, 2005
    February 29, 2004
    February 29, 2012
    样例输出
    Case #1: 1
    Case #2: 0
    Case #3: 1
    Case #4: 3

    水题了,不用解释。
    #include <iostream>
    #include <cstring>
    #include <string.h>
    #include <cstdio>
    using namespace std;
    
    int findx(char *s){
    	if(strcmp(s,"January")==0) return 1;
    	else if(strcmp(s,"February")==0) return 2;
    	else if(strcmp(s,"March")==0) return 3;
    	else if(strcmp(s,"April")==0) return 4;
    	else if(strcmp(s,"May")==0) return 5;
    	else if(strcmp(s,"June")==0) return 6;
    	else if(strcmp(s,"July")==0) return 7;
    	else if(strcmp(s,"August")==0) return 8;
    	else if(strcmp(s,"September")==0) return 9;
    	else if(strcmp(s,"October")==0) return 10;
    	else if(strcmp(s,"November")==0) return 11;
    	else return 12;
    }
    
    int main(){
    	char str[15]; int day,year;
    	int icase=0,T,pre,now,ans;
    	scanf("%d",&T);
    	while(T--){
    		ans=0;
    		scanf("%s%d, %d",str,&day,&year);
    		int m=findx(str);
    		pre=year;
    		if(m<2) pre--;
    		else if(m==2){
    			if(day<=29) pre--;
    		}
    		scanf("%s%d, %d",str,&day,&year);
    		now=year;
    		m=findx(str);
    		now=year;
    		if(m<2) now--;
    		else if(m==2&&day<29) now--;
    		int f4n1001=pre/4-pre/100; 
    		int f4n1002=now/4-now/100;
    		ans=f4n1002-f4n1001;
    		int f4001=pre/400;
    		int f4002=now/400;
    		ans+=(f4002-f4001);
    		printf("Case #%d: %d
    ",++icase,ans);
    	}
    	return 0;
    }
    

      

    题目2 : 回文字符序列

    时间限制:2000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    给定字符串,求它的回文子序列个数。回文子序列反转字符顺序后仍然与原序列相同。例如字符串aba中,回文子序列为"a", "a", "aa", "b", "aba",共5个。内容相同位置不同的子序列算不同的子序列。

    输入

    第一行一个整数T,表示数据组数。之后是T组数据,每组数据为一行字符串。

    输出

    对于每组数据输出一行,格式为"Case #X: Y",X代表数据编号(从1开始),Y为答案。答案对100007取模。

    数据范围

    1 ≤ T ≤ 30

    小数据

    字符串长度 ≤ 25

    大数据

    字符串长度 ≤ 1000

    样例输入
    5
    aba
    abcbaddabcba
    12111112351121
    ccccccc
    fdadfa
    
    样例输出
    Case #1: 5
    Case #2: 277
    Case #3: 1333
    Case #4: 127
    Case #5: 17
    #include <iostream>
    #include <cstdio>
    #include <string.h>
    #include <cstring>
    using namespace std;
    const int MOD=100007;
    char str[1010];
    int dp[1010][1010];
    
    int main(){
    	int T,icase=0;
    	scanf("%d",&T);
    	while(T--){
    		scanf("%s",str+1);
    		int len=strlen(str+1);
    		memset(dp,0,sizeof(dp));
    		dp[1][1]=1;
    		for(int i=2;i<=len;i++){
    			for(int j=i;j>=1;j--){
    				if(i==j) dp[i][j]=1;
    				else {
    					if(str[i]==str[j]){
    						dp[i][j]=(dp[i-1][j]+dp[i][j+1]+1)%MOD;
    					}
    					else dp[i][j]=(dp[i-1][j]+dp[i][j+1]-dp[i-1][j+1])%MOD;
    				}
    			}
    		}
    		printf("Case #%d: %d
    ",++icase,dp[len][1]);
    	}
    	return 0;
    }
    

      

    题目3 : 基站选址

    时间限制:2000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    需要在一个N × M的网格中建立一个通讯基站,通讯基站仅必须建立在格点上。

    网格中有A个用户,每个用户的通讯代价是用户到基站欧几里得距离的平方。

    网格中还有B个通讯公司,维护基站的代价是基站到最近的一个通讯公司的路程(路程定义为曼哈顿距离)。

    在网格中建立基站的总代价是用户通讯代价的总和加上维护基站的代价,最小总代价。

    输入

    第一行为一个整数T,表示数据组数。

    每组数据第一行为四个整数:N, M, A, B。

    接下来的A+B行每行两个整数x, y,代表一个坐标,前A行表示各用户的坐标,后B行表示各通讯公司的坐标。

    输出

    对于每组数据输出一行"Case #X: Y",X代表数据编号(从1开始),Y代表所求最小代价。

    数据范围

    1 ≤ T ≤ 20

    1 ≤ x ≤ N

    1 ≤ y ≤ M

    1 ≤ B ≤ 100

    小数据

    1 ≤ N, M ≤ 100

    1 ≤ A ≤ 100

    大数据

    1 ≤ N, M ≤ 107

    1 ≤ A ≤ 1000

    样例输入
    2
    3 3 4 1
    1 2
    2 1
    2 3
    3 2
    2 2
    4 4 4 2
    1 2
    2 4
    3 1
    4 3
    1 4
    1 3
    样例输出
    Case #1: 4
    Case #2: 13

    此题确实有点坑。最后竟然是碰巧求抛物线对称轴然后枚举相邻点过的。感觉用三分来做会更靠谱。
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #define LL long long
    using namespace std;
    
    LL r[110],c[110];
    LL rpower,rsum,cpower,csum;
    int T,n,m,a,b,icase;
    
    
    LL ldabs(LL x){
    	return x>0?x:-x;
    }
    
    LL caln(LL x,LL pp,LL ss){
    	return (LL)a*x*x-2*x*ss+pp;
    }
    LL calm(LL x,LL pp,LL ss){
    	return (LL)a*x*x-2*x*ss+pp;
    }
    LL findsmall(LL x,LL y,int b){
    	LL l=(1ll<<62);
    	for(int i=0;i<b;i++){
    		l=min(l,ldabs(x-r[i])+ldabs(y-c[i]));
    	}
    	return l;
    }
    
    int main(){
    	LL rt,ct;
    	icase=0;
    	scanf("%d",&T);
    	while(T--){
    		scanf("%d%d%d%d",&n,&m,&a,&b);
    		rpower=rsum=cpower=csum=0;
    		for(int i=1;i<=a;i++){
    			scanf("%lld%lld",&rt,&ct);
    			rpower+=(rt*rt); rsum+=rt;
    			cpower+=(ct*ct); csum+=ct;
    		}
    		for(int i=0;i<b;i++)
    		scanf("%lld%lld",&r[i],&c[i]);
    		LL aver1=rsum/(LL)a;
    		LL aver2=csum/(LL)a;
    //		cout<<aver1<<"YY"<<aver2<<endl;
    		LL taver1=aver1+1,taver2=aver2+1;
    		LL ans=(1ll<<62);
    		LL maha=findsmall(aver1,aver2,b);
    		LL ar=caln(aver1,rpower,rsum);
    		LL ac=calm(aver2,cpower,csum);
    		ans=min(ans,ar+ac+maha);
    		maha=findsmall(aver1,taver2,b);
    		ar=caln(aver1,rpower,rsum);
    		ac=calm(taver2,cpower,csum);
    		ans=min(ans,ar+ac+maha);
    		maha=findsmall(taver1,taver2,b);
    		ar=caln(taver1,rpower,rsum);
    		ac=calm(taver2,cpower,csum);
    		ans=min(ans,ar+ac+maha);
    		maha=findsmall(taver1,aver2,b);
    		ar=caln(taver1,rpower,rsum);
    		ac=calm(aver2,cpower,csum);
    		ans=min(ans,ar+ac+maha);
    		printf("Case #%d: %lld
    ",++icase,ans);
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    echarts 柱状图移除圆角
    echarts 图例显示到右边
    css图片文字一排
    linux磁盘分区、挂载、查看
    mysql的sql筛选排重最大值并修改其属性
    Java调用Linux下的shell命令并将结果以流的形式返回
    SHELL脚本中执行SQL语句操作MYSQL的5种方法
    在 Mac 上使用 `sed` 命令的几个坑
    Linux sed命令实现替换文本内容
    docker ps -a
  • 原文地址:https://www.cnblogs.com/jie-dcai/p/4514168.html
Copyright © 2011-2022 走看看