2017 浙大校赛 [Cloned]

https://vjudge.net/contest/285902#overview

A.Marjar Cola

#include <bits/stdc++.h>
using namespace std;

int T;

int main() {
    scanf("%d", &T);
    while(T --) {
        int x, y, a, b;
        int ans = 0;
        scanf("%d%d%d%d", &x, &y, &a, &b);
        if(x == 1 || y == 1 || (x == 2 && y == 2 && a == 2) ||(x == 2 && y == 2 && b == 2)) {
            printf("INF\n");
            continue;
        }

        while(1) {
            if(a < x && b < y)  break;
            int num1 = a / x;
            int num2 = b / y;
            ans += (num1 + num2);
            a = a - num1 * x + num1 + num2;
            b = b - num2 * y + num1 + num2;
        }
        printf("%d\n", ans);
    }
    return 0;
}

C.How many Nines

#include <bits/stdc++.h>
using namespace std;
int dp[10005][13][33];
int date[13]={0,31,0,31,30,31,30,31,31,30,31,30,31};
int cal(int x)
{
    if(x%400==0||(x%4==0&&x%100!=0))
        return 29;
    else return 28;
}
int check(int x,int y,int z)
{
    int ans=0;
    while(x)
    {
        if(x%10==9) ans++;
        x/=10;
    }
    while(y)
    {
        if(y%10==9) ans++;
        y/=10;
    }
    while(z)
    {
        if(z%10==9) ans++;
        z/=10;
    }
    return ans;
}
int find_last(int x,int y,int z)
{
    if(z!=1) return dp[x][y][z-1];
    int day=date[y-1];
    if(y==3) day=cal(x);
    if(y!=1) return dp[x][y-1][day];
    return dp[x-1][12][31];
}
int main()
{
    for(int i=2000;i<=9999;i++)
    {
        int last_day;
        for(int j=1;j<=12;j++)
        {
            int day=date[j];
            if(j==2) day=cal(i);
            for(int k=1;k<=day;k++)
            {
                dp[i][j][k]=check(i,j,k);
                if(k!=1) dp[i][j][k]+=dp[i][j][k-1];
                else if(j!=1) dp[i][j][k]+=dp[i][j-1][last_day];
                else dp[i][j][k]+=dp[i-1][12][31];
            }
            last_day=day;
        }
    }
    int T;scanf("%d",&T);
    while(T--)
    {
        int x1,y1,z1,x2,y2,z2;
        scanf("%d%d%d%d%d%d",&x1,&y1,&z1,&x2,&y2,&z2);
        printf("%d\n",dp[x2][y2][z2]-find_last(x1,y1,z1));
    }
}

F.Intervals

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 10;
int T;

struct Node{
    int l;
    int r;
    int num;
}node[maxn], n[maxn];

bool cmp(const Node &a, const Node &b) {
    if(a.l != b.l) return a.l < b.l;
    else return a.r < b.r;
}

bool cmpp(const Node &a, const Node &b) {
    return a.r > b.r;
}

bool isin(const Node &a, const Node &b, const Node &c) {
    if(a.r >= b.l && b.r >= c.l && a.r >= c.l) return true;
    return false;
}

int main() {
    scanf("%d", &T);
    while(T --) {
       int N;
       scanf("%d", &N);
       for(int i = 1; i <= N; i ++) {
            scanf("%d%d", &node[i].l, &node[i].r);
            node[i].num = i;
       }

       vector<int> ans;
       sort(node + 1, node + 1 + N, cmp);
       n[1] = node[1], n[2] = node[2];
       for(int i = 3; i <= N; i ++) {
            n[3] = node[i];
            sort(n + 1, n + 1 + 3, cmp);
            if(isin(n[1], n[2], n[3])) {
                sort(n + 1, n + 1 + 3, cmpp);
                ans.push_back(n[1].num);
                swap(n[1], n[3]);
            }
            else sort(n + 1, n + 3 + 1, cmpp);
       }

       sort(ans.begin(), ans.end());
       printf("%d\n", ans.size());
       for(int i = 0; i < ans.size(); i ++)
            printf("%d%s", ans[i], i != ans.size() - 1 ? " " : "\n");

    }
    return 0;
}

G.Seven-Segment Display

#include<bits/stdc++.h>
using namespace std;
const int maxn=5500;
bitset<maxn>G[130][10],ans;
int t[9];
bool vis[9];
void work(int P)
{
    for(int i=0;i<(1<<7);i++)
    {
        memset(vis,0,sizeof(vis));
        for(int k=0;k<7;k++)
            if(!(i>>k&1)) vis[t[k]]=1;
        if(vis[1]&&vis[2]) G[i][1][P]=1;
        if(vis[0]&&vis[1]&&vis[6]&&vis[4]&&vis[3]) G[i][2][P]=1;
        if(vis[0]&&vis[1]&&vis[6]&&vis[2]&&vis[3]) G[i][3][P]=1;
        if(vis[1]&&vis[5]&&vis[6]&&vis[2]) G[i][4][P]=1;
        if(vis[0]&&vis[5]&&vis[6]&&vis[2]&&vis[3]) G[i][5][P]=1;
        if(vis[0]&&vis[5]&&vis[6]&&vis[4]&&vis[2]&&vis[3]) G[i][6][P]=1;
        if(vis[0]&&vis[1]&&vis[2]) G[i][7][P]=1;
        if(vis[0]&&vis[1]&&vis[2]&&vis[3]&&vis[4]&&vis[5]&&vis[6]) G[i][8][P]=1;
        if(vis[0]&&vis[1]&&vis[2]&&vis[3]&&vis[5]&&vis[6]) G[i][9][P]=1;
    }
}
int main()
{
    for(int i=0;i<7;i++)
        t[i]=i;
    int k=0;
    do
    {
        work(k);
        k++;
    }while(next_permutation(t,t+7));
    int T;scanf("%d",&T);
    while(T--)
    {
        ans.set();
        int n;scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&k);
            int x=0;char str[9];scanf("%s",&str);
            for(int j=0;j<7;j++)
                x=x*2+str[j]-‘0‘;
            ans&=G[x][k];
        }
        if(ans.any()) printf("YES\n");
        else printf("NO\n");
    }
}

H.Saddle Points

#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
int t[1005][1005],p[1005][1005],tmp[1005],kp[2005];
struct node
{
    int id,val;
}b[1005];
bool cmp1(const node &A,const node &B)
{
    return A.val>B.val;
}
bool cmp2(const node &A,const node &B)
{
    return A.val<B.val;
}
int main()
{
    kp[0]=1;
    for(int i=1;i<2005;i++)
        kp[i]=kp[i-1]*2%mod;
    int T;scanf("%d",&T);
    while(T--)
    {
        int n,m;scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                scanf("%d",&t[i][j]),p[i][j]=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
                b[j].id=j,b[j].val=t[i][j],tmp[j]=0;
            sort(b+1,b+m+1,cmp1);
            for(int j=2;j<=m;j++)
            {
                if(b[j].val==b[j-1].val)
                    tmp[b[j].id]=tmp[b[j-1].id];
                else tmp[b[j].id]=j-1;
            }
            for(int j=1;j<=m;j++)
                p[i][j]+=tmp[j];
        }
        for(int j=1;j<=m;j++)
        {
            for(int i=1;i<=n;i++)
                b[i].id=i,b[i].val=t[i][j],tmp[i]=0;
            sort(b+1,b+n+1,cmp2);
            for(int i=2;i<=n;i++)
            {
                if(b[i].val==b[i-1].val)
                    tmp[b[i].id]=tmp[b[i-1].id];
                else
                    tmp[b[i].id]=i-1;
            }
            for(int i=1;i<=n;i++)
                p[i][j]+=tmp[i];
        }
        int ans=0;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                ans=(ans+kp[p[i][j]])%mod;
        printf("%d\n",ans);
    }
}

I.Course Selection System

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 10;
int T;
int h[maxn], c[maxn];
int dp[maxn];

int main() {
    scanf("%d", &T);
    while(T --) {
        int N;
        long long ans = 0;
        scanf("%d", &N);

        long long sum1 = 0;
        for(int i = 0; i < N; i ++) {
            scanf("%d%d", &h[i], &c[i]);
            sum1 += c[i];
        }
        for(int i=0;i<=sum1;i++)
        {
            dp[i]=0;
        }
        for(int i = 0; i < N; i ++) {
            for(int j = sum1; j >= c[i]; j --) {
                if(dp[j] < dp[j - c[i]] + h[i]) {
                    dp[j] = dp[j - c[i]] + h[i];
                    long long cnt = 1LL*dp[j] * dp[j] - 1LL * dp[j] * j - 1LL * j * j;
                    if(cnt > ans) ans = cnt;
                }
            }
        }

        printf("%lld\n", ans);
    }
    return 0;
}

J.Knuth-Morris-Pratt Algorithm

#include <bits/stdc++.h>
using namespace std;
char t[1004];
int main()
{
    int T;scanf("%d",&T);
    while(T--)
    {
        scanf("%s",t+1);
        int ans=0,len=strlen(t+1);
        for(int i=1;i<=len;i++)
        {
            if(t[i]==‘c‘&&i<=len-2&&t[i+1]==‘a‘&&t[i+2]==‘t‘)
                ans++;
            if(t[i]==‘d‘&&i<=len-2&&t[i+1]==‘o‘&&t[i+2]==‘g‘)
                ans++;
        }
        printf("%d\n",ans);
    }
}

有队友的快落

FH

原文地址:https://www.cnblogs.com/zlrrrr/p/10467266.html

时间: 2024-11-12 17:55:21

2017 浙大校赛 [Cloned]的相关文章

2017 Fzu校赛 [Cloned]

A - Salty Fish 海边躺着一排咸鱼,一些有梦想的咸鱼成功翻身(然而没有什么卵用),一些则是继续当咸鱼.一个善良的渔夫想要帮这些咸鱼翻身,但是渔夫比较懒,所以只会从某只咸鱼开始,往一个方向,一只只咸鱼翻过去,翻转若干只后就转身离去,深藏功与名.更准确地说,渔夫会选择一个区间[L,R],改变区间内所有咸鱼的状态,至少翻转一只咸鱼. 渔夫离开后想知道如果他采取最优策略,最多有多少只咸鱼成功翻身,但是咸鱼大概有十万条,所以这个问题就交给你了! Input 包含多组测试数据. 每组测试数据的第

2017 多校赛 第二场

1003.Maximum Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 0    Accepted Submission(s): 0 Problem Description Steph is extremely obsessed with “sequence problems” that are usually see

15th浙大校赛 zoj3860-3868

比赛链接: here 题目对应到ZOJ3860~3868 A Find the Spy 水 #include<cstdio> #include<map> #include<cstring> #include<iostream> using namespace std; map<int,int>mp; map<int,int>::iterator it; int main() { int T,n,x; scanf("%d&qu

ZOJ 3866 Cylinder Candy (浙大校赛+积分应用)

题目链接:ZOJ 3866 Cylinder Candy 题意:抽象出来就是求一个圆柱体外面加一层厚度为d的巧克力,求包装完这个立体图形的体积和表面积. 剖析: 以下是包装后的三视图: 图3 接下里就是积分了 2*V1是图3绕y轴的体积 V2是中间的半径为(r+d)的圆柱体积 S1是中间的半径为(r+d)的圆柱的表面积 S2是上下两个半径为r的圆的面积 S3是图3绕y轴的侧面积 附上旋转体的侧面积和体积求法: AC代码: #include <stdio.h> #include <math

2019 浙大校赛解题过程及题解

解题过程  开场lfw看J,被孪生素数误导,没有看出水题的本质,byf及时提醒后,lfw忘记N=1的情况要特判.之后byf写E,忘记开long long,wa+1.Shl看出A题思路,告诉lfw开始写A,lfw忘记先排序,WA+1.byf看出B题做法,lfw写java过掉,shl与lfw讨论G,lfw开始写G,byf看出C可以hash暴力,lfwG忘记清空一个值,导致特殊情况会加两次,wa+1,byf使用mp作hash,带logn常数TLE,随后转成long long的hash值,使用unord

2019浙大校赛--J--Extended Twin Composite Number(毒瘤水题)

毒瘤出题人,坑了我们好久,从基本的素数筛选,到埃氏筛法,到随机数快速素数判定,到费马小定理,好好的水题做成了数论题. 结果答案是 2*n=n+3*n,特判1,2. 以下为毒瘤题目: 题目大意: 输入一个数n, 输出两个合数(即非素数)a,b 实现 n+a=b 解题思路 3n=n+2n; 特判1.2 代码: 1 #include<iostream> 2 #include<stdio.h> 3 using namespace std; 4 typedef long long ll; 5

[水]浙大校赛补题

本来以为会巨难无比又有别的比赛可以打于是赛后补题,结果发现似乎略水,反正是找到了四个水题先贴下来 ZOJ-4099 J #include<iostream> #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; int t; ll x, y, n; int main() { cin >> t; while (t--) { scanf("%lld

hdu6069[素数筛法] 2017多校3

/*hdu6069[素数筛法] 2017多校3*/ #include <bits/stdc++.h> using namespace std; typedef long long LL; LL l, r, k; const LL MOD = 998244353LL; int T, n, prime[1100000], primesize; bool isprime[11000000]; void getlist(int listsize) { memset(isprime, 1, sizeof

CSU 1425 NUDT校赛 I题 Prime Summation

这个题本来有希望在比赛里面出了的 当时也想着用递推 因为后面的数明显是由前面的推过来的 但是在计算的时候 因为判重的问题 ...很无语.我打算用一个tot[i]来存i的总种树,tot[i]+=tot[j]//j为可以由j推到i的一系列数,但这样是不对的,会产生大量重复计算... 看了下标程才发现要用二维来计算出种类总数,f[i][j]+=sum(f[i-j][k]) 表示在推i数的时候,第一个素数为j的种类数,注意j一定为素数,而且k不能大于j...标程里面处理的比较简练,就学了下他的写法. 至