Jeanny
寂兮,寥兮,独立不改,周行而不殆

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;
} 

 

posted on 2020-07-16 19:49  Jeanny  阅读(118)  评论(0)    收藏  举报