D - The Lucky Week ZOJ - 3939 (思维)

题目链接:

D - The Lucky Week

 ZOJ - 3939

题目大意:幸运的星期指,星期一为每个月的1 or 11 or 21号。给出第一个幸运星期的时间,问从当前的日起开始。第n个的日期。

具体思路:我们通过打表可以发现,每隔400年,当前的这一天的星期和400年后的是相同的。所以我们先求出一个400年有多少个幸运的天数(1600-1999),然后判断当前的年份如果以1600年开始的话,往后n个幸运日是多少,然后再做差以原来的起点输出就可以了。

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 # define ll long long
 4 # define inf 0x3f3f3f3f
 5 const int maxn = 2e6+100;
 6 struct node
 7 {
 8     ll  y,m,d;
 9     node() {}
10     node(ll xx,ll yy,ll zz)
11     {
12         y=xx;
13         m=yy;
14         d=zz;
15     }
16 } ;
17 //bool check(ll y,ll m,ll d)
18 //{
19 //    ll a;
20 //    if(m==1||m==2)
21 //    {
22 //        m+=12;
23 //        y--;
24 //    }
25 //    if((y<1752)||(y==1752&&m<9)||(y==1752&&m==9&&d<3))
26 //        a=(d+2*m+3*(m+1)/5+y+y/4+5)%7;
27 //    else
28 //        a=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
29 //    if(a==0)
30 //        return true;
31 //    return false;
32 //}
33 bool check(int year,int month,int day)
34 {
35     if(month < 3) { year -= 1;  month += 12; }
36     int c = int (year / 100), y = year - 100 * c;
37     int w = int ( c / 4) - 2 * c + y + int ( y / 4 ) +(26 * ( month + 1 ) / 10) + day - 1;
38     w = (w % 7 + 7) % 7;
39
40     if (w == 1) return 1;
41     else return 0;
42 }
43 vector<node>q;
44 map<ll,ll>vis;
45 void init(){
46 for(ll i=1600;i<=1600+400-1;i++){
47 for(ll j=1;j<=12;j++){
48 if(check(i,j,1)){
49 q.push_back(node(i,j,1));
50 vis[i*1000+j*100+1]=q.size()-1;
51 }
52 if(check(i,j,11)){
53 q.push_back(node(i,j,11));
54 vis[i*1000+j*100+11]=q.size()-1;
55 }
56 if(check(i,j,21)){
57 q.push_back(node(i,j,21));
58 vis[i*1000+j*100+21]=q.size()-1;
59 }
60 }
61 }
62 }
63 int main()
64 {
65     init();
66     int T;
67     scanf("%lld",&T);
68     while(T--)
69     {
70        ll y,m,d,n;
71         scanf("%lld %lld %lld %lld",&y,&m,&d,&n);
72         ll tmp1,tmp2;
73         tmp1=(y-1600)%400+1600;
74         tmp2=tmp1*1000+m*100+d;
75         int pos=vis[tmp2];
76         int t1=(pos+n-1)%q.size();
77         int t2=(pos+n-1)/q.size();
78         printf("%lld %lld %lld\n",y+q[t1].y-q[pos].y+t2*400,q[t1].m,q[t1].d);
79     }
80     return 0;
81 }

 

原文地址:https://www.cnblogs.com/letlifestop/p/10684937.html

时间: 2024-10-14 00:19:10

D - The Lucky Week ZOJ - 3939 (思维)的相关文章

zoj 3672 思维题

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4915 真是老了,脑子不会动了,但是其实就算现在搜了题解A了,还是没总结出思维方式 三点: 1.segma(a[i]-b[i])必须是偶数,,因为其实每次操作都是相当于从segma(a[i]-b[i])里面减去2*delta 2.a[i]>=b[i] 题目说的很清楚,只能减去,所以这点必须满足 前两点都想到了,但是自己能举出反例,后来队友A掉了 3.max(a[i]-b[i])

ZOJ 2975 思维

题意 给出一个矩形 问在其中存在多少子矩形 其四个角上的字母是一样的 一开始暴力写了一发 先枚举行数 再枚举两个列数 再向下枚举行数 判断能否 没有意外的超时了 后来想了想 当我们已经确定两个列数的时候 向下寻找的时候 如果找到了tot条边与第一条边同字母 这些边可以组成(tot-1)*tot个矩形 使满足题意 为了避免重复寻找 需要一个map来记录 由于矩形的边最长100 我们存已经检索的字母*1000*1000+左列数*1000+右列数 #include<stdio.h> #include

浙江省赛真题2018

只做了签到题,菜就是菜,找啥理由: 但失败了总要得到一些教训: A - Peak ZOJ - 4024 题意:就是给你一个序列让你判断是不是先增加后减少的,签到: #include<bits/stdc++.h> using namespace std; #define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++) #define per(i,j,k) for(int i=(int)k;i>=(int)j;i--) #define pb pus

ZOJ 3233 Lucky Number

Lucky Number Time Limit: 5000ms Memory Limit: 32768KB This problem will be judged on ZJU. Original ID: 323364-bit integer IO format: %lld      Java class name: Main Watashi loves M mm very much. One day, M mm gives Watashi a chance to choose a number

zoj 2402 - Lenny&#39;s Lucky Lotto Lists

题目:一个序列,每个元素都至少的前面的二倍,最大值为n,问长度为l的这种船有多少个. 分析:dp,LIS类似物. 状态:f(i,j)结束数字为j且长度为i的序列的个数,有转移方程: F[ i ][ j ] = Sum(F[ i-1 ][ k ]) { 2^(i-2)<= k <= j/2): 再用S[ i ][ j ]求出长度为i结束不超过j的串的个数就可以了. 说明:(2011-09-19 01:33). #include <iostream> #include <cstd

ZOJ 3829 贪心 思维题

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3829 现场做这道题的时候,感觉是思维题,自己智商不够,不敢搞,想着队友智商好,他们搞吧,但是没出来这题...... 以后任何时候,都自信点....该想的还是好好自己想,这类题感觉就是先去找性质,然后一点点找规律,如果必要的话,自己提出一点猜想,然后如果自己举不出来反例,就暂时认为是正确的 下午搞了一下午,发现还是悲剧,晚上参考了两个题解 http://blog.csdn.

Welcome Party ZOJ - 4109 (思维+并查集)

题目链接: Welcome Party  ZOJ - 4109 题目大意:给你T组测试样例,然后n个人,m个关系,每一个关系包括两个人,这两个人为好朋友,然后问你怎么安排顺序,使得整个队伍的友情损失度最小(当一个人放置时,如果他的前面中没有他的朋友,那么整个队伍的朋友损失度就会加1) 具体思路:首先用并查集求出每一个联通块,然后用一个超级汇点连向这些连通块的根,然后优先队列+bfs求出字典序最小的正解就可以了. AC代码: 1 #include<bits/stdc++.h> 2 using n

ZOJ 3962:Seven Segment Display(思维)

https://vjudge.net/problem/ZOJ-3962 题意:有16种灯,每种灯的花费是灯管数目,代表0~F(十六进制),现在从x开始跳n-1秒,每一秒需要的花费是表示当前的数的花费之和,问n-1秒后这段时间的花费总共是多少.跳到FFFFFFFF之后会跳回00000000. 思路:怀疑人生的题目.如果从平时计算[L,R]的花费,就计算[0,R] - [0,L-1]这样的角度来看,就会好做很多.同样如果跳到1LL<<32之后回到0,也分段考虑.这样写一个函数就可以计算了. 考虑三

ZOJ 3233 Lucky Number 容斥

给你a数组和b数组 求x到y之间有多少个数至少被a中一个数整除并且至少不被b中一个数整除 容斥第一问很简单 第二问可以考虑反面 设满足被a中至少一个数整除的数有sum1个 在被a中至少一个数整除的前提下 被b中所有数整除的数有sum2 答案就是sum1-sum2 在dfs的时候溢出了 借鉴了某大牛的方法 #include <cstdio> #include <cstring> using namespace std; typedef long long LL; const int