[蓝桥杯2017初赛]日期问题与k倍区间

 日期问题

小明正在整理一批历史文献。这些历史文献中出现了很多日期。
小明知道这些日期都在1960年1月1日至2059年12月31日。
令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。
更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。  
比如02/03/04,可能是2002年03月04日、2004年02月03日或2004年03月02日。  
给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?

输入格式

一个日期,格式是"AA/BB/CC"。  (0 <= A, B, C <= 9)  

输出格式

输出若干个不相同的日期,每个日期一行,格式是"yyyy-MM-dd"。
多个日期按从早到晚排列。  

输入样例 复制

02/03/04

输出样例 复制

2002-03-04
2004-02-03
2004-03-02

#include<bits/stdc++.h>
using namespace std;    
int s[12]={31 ,28,31,30,31,30,  31 ,  31 ,  30 ,  31 ,  30 ,  31 };
int change(string a)
{
    istringstream is(a); //构造输入字符串流,流的内容初始化为“12”的字符串   
    int i;   
    is >> i; //从is流中读入一个int整数存入i中  
    return i;
}
int w1(int year,int mouth,int day)
{
    int a1;
    if(year>=0&&year<=59)
    a1=2000+year;
    if(year>=60&&year<=99)
     a1=1900+year;
    if((a1%4==0&&a1%100!=0)||(a1%400==0))
    s[1]=29;
    if(mouth<=0||mouth>12)return 0;
    if(s[mouth-1]<day||day==0 )return 0;
    return a1*10000+mouth*100+day;
}

int main()
{
    string a;
    cin>>a;
    string m=a.substr(0,2);
    string n=a.substr(3,2);
    string w=a.substr(6,2);
    int year,mouth,day;
    year=change(m);
    mouth=change(n);
    day=change(w);
    long long  r1=w1(year,mouth,day);
    long long  r2=w1(day,year,mouth);//月日年 
    long long  r3=w1(day,mouth,year);//日月年 
    
    long long g[3];
      g[0]=r1;
      g[1]=r2;
      g[2]=r3;
  sort(g,g+3);
  r1=g[0];
  r2=g[1];
  r3=g[2];
//cout<<r1<<" "<<r2<<" "<<r3<<endl;
if(r1!=0)
  {cout<<r1/10000<<"-";
    printf("%02d",(r1/100)%100);
    cout<<"-";
    printf("%02d\n",r1%100);}
if(r2!=0&&r2!=r1)
{    cout<<r2/10000<<"-";
    printf("%02d",(r2/100)%100);
    cout<<"-";
    printf("%02d\n",r2%100);
}
if(r3!=0&&r3!=r2&&r3!=r1)
{
  cout<<r3/10000<<"-";
    printf("%02d",(r3/100)%100);
    cout<<"-";
    printf("%02d\n",r3%100);
}
    
    //cout<<r2/10000<<"-"<<(r2/100)%100<<"-"<<r2%100<<endl;
    //cout<<r3/10000<<"-"<<(r3/100)%100<<"-"<<r3%100<<endl;
    return 0;
}

k倍区间

给定一个长度为N的数列,A1, A2, ... AN。
如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间。  
你能求出数列中总共有多少个K倍区间吗? 

输入格式

第一行包含两个整数N和K。(1 <= N, K <= 100000)  
以下N行每行包含一个整数Ai。(1 <= Ai <= 100000)  

输出格式

输出一个整数,代表K倍区间的数目。

输入样例 复制

5 2
1
2
3
4
5

输出样例 复制

6
#include<iostream>

using namespace std;

const int N =100010;
int n,k;
long long s[N],cnt[N];
long long res;

int main()
{
  cnt[0] = 1;
  cin >> n >> k;

  for(int i = 1; i <= n; i ++ )
  {
      cin >> s[i];
      s[i] += s[i - 1];

      res += cnt[s[i] % k];
      cnt[s[i] % k]++ ;
  }

  cout << res;
  return 0;
}

猜你喜欢

转载自blog.csdn.net/aasd23/article/details/124947837