2016NOIP-J T2 回文日期
#include<cmath> #include<cstdio> #include<iostream> #include<algorithm> using namespace std; int a[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; int x,y,p,ans; int main(){ scanf("%d%d",&x,&y); for(int i = 1; i <= 12; i++){ for(int j = 1; j <= a[i]; j++){ p = (j % 10 * 10000000) + (j/10 % 10 * 1000000) + (i % 10 * 100000) + (i/10%10 * 10000) + (i*100) + j; // cout<<p<<endl; if(p >= x && p <= y) ans++; } } if(92200229 >= x && 92200229<=y) ans++; printf("%d",ans); } // 20090705 // 20120112 // // 首先想到年 : 20099002 月不合法,如何判断不合法 // ... // // 想到通过月日判断: 0105->50100105->判断是否在范围内 // 二月如何处理? // 0229->92200229->9220
2016NOIP-J T3海港
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #include<queue> #include<vector> using namespace std; int n,t,k,s,now,pre,cnt[1000005]; struct Node{ int t,c; }a[1000005]; int main(){ scanf("%d",&n); while(n--){ scanf("%d%d",&t,&k); while(k--){ a[++now].t = t; scanf("%d",&a[now].c); if(!cnt[a[now].c]) s++; cnt[a[now].c]++; } while(a[now].t - a[pre].t >= 86400){ if((--cnt[a[pre].c]) == 0) s--; pre++; } printf("%d\n",s); } return 0; } //时间复杂度 10^5 类似于单调队列
T3 新扫雷游戏 递推
#include<bits/stdc++.h> using namespace std; int a[100005],b[100005],ans; void f(int n){ int fl = 0; for(int i = 3; i <= n; i++){ b[i] = a[i - 1] - b[i - 1] - b[i - 2]; if(b[i] > 1 || b[i] < 0){ fl = 1;break; } } if(fl == 0 && b[n - 1] + b[n] == a[n]) ans++; } int t,n; int main(){ scanf("%d",&t); while(t--){ scanf("%d",&n); ans = 0; for(int i = 1; i <= n; i++){ scanf("%d",&a[i]); } //如果是0或者2,则要不方案为1要么方案为0 if(a[1] == 0) { b[1] = 0; b[2] = 0; f(n); } else if(a[1] == 2){ b[1] = 1; b[2] = 1; f(n); } else if(a[1] == 1){//如果第一个数是1,则最多两种方法,分类判断是否成立 b[1] = 0; b[2] = 1; f(n); b[1] = 1; b[2] = 0; f(n); } printf("%d\n",ans); } return 0; }
T4 魔法阵
#include <cstdio> #include <cstring> #include <cstdlib> #include <cstring> using namespace std; int n, m; int val[40010], num[15010]; int a[15010], b[15010], c[15010], d[15010]; int main(){ scanf("%d%d", &n, &m); for(int i = 1; i <= m; i ++){ scanf("%d", &val[i]); num[val[i]] ++; } for(int i = 1; i*9+1 <= n; i ++){ int sum = 0; for(int j = i*9+2; j <= n; j ++){ sum += num[j-7*i-1] * num[j-9*i-1]; c[j-i] += num[j] * sum; d[j] += num[j-i] * sum; } sum = 0; for(int j = n-i*9-1; j >= 1; j --){ sum += num[j+i*9+1] * num[j+i*8+1]; a[j] += num[j+2*i] * sum; b[j+2*i] += num[j] * sum; } } for(int i = 1; i <= m; i ++){ printf("%d %d %d %d\n", a[val[i]], b[val[i]], c[val[i]], d[val[i]]); } return 0; }