tyvj NOIP2017金秋冲刺训练营杯联赛模拟大奖赛第一轮Day2题解

  上星期打的...题有点水,好多人都AK了

  T1排个序贪心就好了

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=500010,inf=1e9;
struct poi{int e,s;}a[maxn];
int n,m,s,k,x,y,cnt;
int cp[maxn];
ll ans;
void read(int &k)
{
    int f=1;k=0;char c=getchar();
    while(c<‘0‘||c>‘9‘)c==‘-‘&&(f=-1),c=getchar();
    while(c<=‘9‘&&c>=‘0‘)k=k*10+c-‘0‘,c=getchar();
    k*=f;
}
inline bool cmp(poi a,poi b){return a.e==b.e?a.s>b.s:a.e<b.e;}
inline bool cmp2(poi a,poi b){return a.s>b.s;}
int main()
{
    freopen("express.in","r",stdin);
    freopen("express.out","w",stdout);
    read(n);read(m);read(s);read(k);
    for(int i=1;i<=m;i++)
    {
        read(x);read(y);
        if(y<=2)continue;
        a[++cnt].e=x;a[cnt].s=y-2;
    }
    sort(a+1,a+1+cnt,cmp);
    for(int i=1;i<=cnt;i++)if(a[i].e!=a[i-1].e)cp[a[i].e]=i;
    for(int i=1;i<=n;i++)
    {
        if(!cp[i])return puts("-23333333"),0;
        int kk=k;
        for(int j=cp[i];j<=cnt&&a[j].e==i;j++)
        if(kk>0)
        {
            if(!s)return puts("-23333333"),0;
            s--;kk-=a[j].s;ans+=a[j].s;a[j].s=0;
        }
        if(kk>0)return puts("-23333333"),0;
    }
    if(s)
    {
        sort(a+1,a+1+cnt,cmp2);
        for(int i=1;i<=s;i++)
        ans+=a[i].s;
    }
    printf("%lld\n",ans);
    return 0;
}

  T2我写的方法就太鶸了,所以只说某个很妙的做法(%%%腾腾太强辣!)

  用一个指针扫,扫到某个括号就跳到对应的括号然后反向,遇到字符输出,模拟一下就知道是非常正确的

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=500010,inf=1e9;
char s[maxn];
int n,top;
int st[maxn],op[maxn];
void read(int &k)
{
    int f=1;k=0;char c=getchar();
    while(c<‘0‘||c>‘9‘)c==‘-‘&&(f=-1),c=getchar();
    while(c<=‘9‘&&c>=‘0‘)k=k*10+c-‘0‘,c=getchar();
    k*=f;
}
int main()
{
    freopen("unknown.in","r",stdin);
    freopen("unknown.out","w",stdout);
    scanf("%s",s+1);n=strlen(s+1);
    for(int i=1;i<=n;i++)
    {
        if(s[i]==‘(‘)st[++top]=i;
        if(s[i]==‘)‘)op[i]=st[top],op[st[top--]]=i;
    }
    for(int i=1,st=1;i<=n;i+=st)
    if(s[i]==‘(‘||s[i]==‘)‘)i=op[i],st=-st;
    else printf("%c",s[i]);
    return 0;
}

  T3状压,枚举子集的子集是3^n的,于是可以过

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=20;
int n,m,K,x,y;
int f[1<<maxn];
bool v[maxn][maxn],mp[1<<maxn];
void read(int &k)
{
    int f=1;k=0;char c=getchar();
    while(c<‘0‘||c>‘9‘)c==‘-‘&&(f=-1),c=getchar();
    while(c<=‘9‘&&c>=‘0‘)k=k*10+c-‘0‘,c=getchar();
    k*=f;
}
int main()
{
    freopen("prison.in","r",stdin);
    freopen("prison.out","w",stdout);
    read(n);read(m);read(K);
    for(int i=1;i<=m;i++)read(x),read(y),v[x][y]=v[y][x]=1;
    int state=(1<<n)-1;
    for(int i=0;i<=state;i++)
    {
        int cnt=0;
        for(int j=1;j<=n;j++)
        if(i&(1<<(j-1)))
        for(int k=1;k<j;k++)
        if(i&(1<<(k-1)))
        cnt+=v[j][k];
        if(cnt<=K)mp[i]=1;
    }
    memset(f,32,sizeof(f));f[0]=0;
    for(int i=0;i<=state;i++)
    {
        int S=i^state;
        for(int j=S;j;j=(j-1)&S)
        if(mp[j])f[i|j]=min(f[i|j],f[i]+1);
    }
    printf("%d\n",f[state]);
    return 0;
}

时间: 2024-10-18 21:00:56

tyvj NOIP2017金秋冲刺训练营杯联赛模拟大奖赛第一轮Day2题解的相关文章

TYVJ NOIP2017金秋冲刺训练营杯联赛模拟大奖赛第二轮Day2题解

肝了两题... T1一眼题,分解质因数,找出2的个数和5的个数取min输出 #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<algorithm> #define ll long long using namespace std; const int maxn=1000010,inf=1e9; int n,m,T; int fac2[m

NOIP2017金秋冲刺训练营杯联赛模拟大奖赛Day2

T1 模拟+排序,先把n个公司贪成合法,再在剩下的天数中找最大值 注意不要统计2-t<0的天数 1 #include <cstdio> 2 #include <vector> 3 #include <iostream> 4 #include <algorithm> 5 #define ll long long 6 using namespace std; 7 long long n,m,s,k,e,t,sz,j,flag=0,ans=0,cnt[200

NOIP2017金秋冲刺训练营杯联赛模拟大奖赛Day1

前言:昨天晚上没睡好,导致今天早上起来头疼,于是睡了一多个小时,本来不想比赛了,但是发现第一题的做法实在是太显而易见,于是就愉快的AC了 T1 很简单的一道线段树问题 天天去哪吃 题目大意 小天在第i天去了第x[i]号餐厅吃饭,并且在接下来的n/2天内都不能再去这个餐厅去吃饭了,$x[i]=(a*x[i-1]+b*x[i-2]+k)\%n$ (k是能使x[i]合法的最小值,即x[i]在x[i-n/2~i-1]中没有出现过) 输入 n,m,a,b,x[1],x[2] 输出 x[3],x[4]--x

WC2019 全国模拟赛第一场 T1 题解

由于只会T1,没法写游记,只好来写题解了... 题目链接 题目大意 给你一个数列,每次可以任取两个不相交的区间,取一次的贡献是这两个区间里所有数的最小值,求所有取法的贡献和,对 \(10^9+7\) 取模. 数列长度 \(2\times 10^5\) ,值域 \(1\) ~ \(10^9\) . \(O(n^4)\) 做法 预处理区间最小值,枚举选的两个区间. #include <iostream> #include <cstdio> #include <algorithm&

【前行】◇第3站◇ 国庆训练营&#183;OI制模拟赛

[第3站] 国庆训练营·OI制模拟赛Ⅰ 怀着冲刺提高组400的愿望来到这个very small but very interesting 的训练营QwQ 在北大dalao的带领下开始了第一场OI模拟赛[炸心态ヽ(*.>Д<)o゜] ? 简单总结 感觉非常爆炸…… 第一题还好,一眼看出结论题,所以开始打表……没想到只打出来了一种情况(为什么全是特殊情况),然后就凉了. 第二题就开始崩溃了.首先画图思考了大概20分钟……然后发现想不出正解,就开始想要骗分.看了看数据阶梯,发现自己好像只能做前1/3

JZOJ4316【NOIP2015模拟11.5】Isfind 题解

JZOJ4316 [NOIP2015模拟11.5]Isfind 题解 Description Input Output Sample Input 4 3    acbc    abc    cba    cc Sample Output Y    N    Y Data Constraint 思路: 题意要看懂,首先声明一下"子串"和"子序列"的区别,S的"子串"意思是在S中选取任意i个(0 < i <= |S|)连续字符组成的字符串

2017 百度杯丶二月场第一周WP

1.祸起北荒 题目: 亿万年前 天子之子华夜,被父神之神末渊上神告知六荒十海之北荒西二旗即将发生一场"百度杯"的诸神之战 他作为天族的太子必须参与到此次诸神之战定六荒十海 华夜临危受命,马上带着火凤凰飞行到北荒"西二旗" 却没想到这六荒之首北荒西二旗果然名不虚传,这是一个位于六层虚数空间上的时空大陆 他需要闯过每一层虚数空间,方能到达虚数空间 第一层虚数空间是需要与一个上古神器"i春秋"进行智能比拼,获取开启第一层虚数空间的flag 启动法诀:

2017.9.23 NOIP2017 金秋杯系列模拟赛 day1 T1

回形遍历( calc .cpp/c/pas) 时间限制:1s内存 限制: 256MB [问题 描 述]给出一个 n*m 的棋盘,按如下方式遍历,请问(x,y)往后 z 步走到的是哪个格子. [输入]输入文件名为 calc.in.一行,包含五个整数:n,m,x,y,z[输出]输出文件名为 calc.out.输出一行,包含两个整数,表示所在格子的横纵坐标[输入输出样例] calc .in calc .out 4 5 3 0 5 2 4 [ 样例解释 ] [数据说明]对于 70%的数据,1<=n,m,

8.24-8.25联赛模拟 解题报告

T1: 直接模拟,然后坐标相同的点的统计用sort来去重,用map等STL会TLE... // MADE BY QT666 #include<cstdio> #include<algorithm> #include<cmath> #include<iostream> #include<cstring> using namespace std; typedef long long ll; const int N=2000050; struct da