NOIP模拟赛16

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

期望得分:100+100+ =200+

实际得分:100+40+70=210

T1天天寄快递

直接模拟,代码丢了。。。。。。

T2天天和不可描述

splay可A

正解dfs+list

#include<iostream>
#include<list>
#include<cstdio>
using namespace std;
list<char>s;
char c;
void getstr(bool rev,list<char>&tmp)
{
    tmp.clear();
    while(true)
    {
        c=cin.get();
        if(c==')') break;
        else if(c=='(')
        {
            list<char>tmp2;
            getstr(!rev,tmp2);
            if(rev) s.splice(tmp.begin(),tmp2);
            else s.splice(tmp.end(),tmp2);
        }
        else if(rev) tmp.push_front(c);
        else tmp.push_back(c);
    }
}
int main()
{
    while(1)
    {
        c=cin.get();
        if(c==EOF) break;
        else if(c=='(')
        {
            list<char>tmp;
            getstr(true,tmp);
            s.splice(s.end(),tmp);
        }
        else s.push_back(c);
    }
    for(list<char>::iterator iter=s.begin();iter!=s.end();iter++) cout<<*iter;
    return 0;
}
View Code

T3 罪犯分组

状压DP

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
bool map[20][20];
int f[1<<16|1];
int main()
{
    int n,m,k,u,v;
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=m;i++) scanf("%d%d",&u,&v),u--,v--,map[u][v]=map[v][u]=true;
    memset(f,63,sizeof(f));
    int S=1<<n;
    f[0]=0;
    int sum;
    for(int i=1;i<S;i++)
    {
        sum=0;
        for(int j=0;j<n;j++)
            for(int k=j+1;k<n;k++)
                if((1<<k)&i && (1<<j)&i && map[j][k]) sum++;
        if(sum<=k) f[i]=1;
        for(int j=i;j;j=(j-1)&i) f[i]=min(f[i],f[j]+f[j^i]);
    }
    printf("%d",f[S-1]);
}
View Code
原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/7598134.html