20180806 考试记录

20180806 考试记录

T1 【NOIP2013模拟联考8】最短路(path)

Solution

设s为第0个标记点,t为k+1个跑k+1次最短路
然后全排列暴力求解qwq
注意最大值要设为long long范围最大值

Code

PS:各种修改qwq

//By Menteur_Hxy
#include<queue>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define int long long
#define F(i,a,b) for(register int i=(a);i<=(b);i++)
#define E(i,u) for(register int i=head[u];i;i=nxt[i])
using namespace std;
typedef pair<int,int> PII;

int read() {
    int x=0,f=1; char c=getchar();
    while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}
    while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
    return x*f;
}

const int N=50010,M=100010;
int cnt;
int head[N],to[M],w[M],nxt[M],poi[20],dis[20][N],vis[N];

priority_queue<PII,vector<PII>,greater<PII> > Q;
void dij(int s) {
    Q.push(PII(dis[s][poi[s]]=0,poi[s]));
    memset(vis,0,sizeof vis);
    while(!Q.empty()) {
        int u=Q.top().second; Q.pop();
        if(vis[u]) continue;
        E(i,u) {
            int v=to[i];
            if(dis[s][v]>dis[s][u]+w[i]) Q.push(PII(dis[s][v]=dis[s][u]+w[i],v));
        }
        vis[u]=1;
    }
}

int ans=3000000000ll;
bool fla[20];
void dfs(int num,int sum,int fr,int k) {
    if(sum>ans) return ;
    if(num==k) {ans=min(ans,sum+dis[fr][poi[k]]);return ;}
    F(i,1,k-1) if(!fla[i]) fla[i]=1,dfs(num+1,sum+dis[fr][poi[i]],i,k),fla[i]=0;
}

#define add(a,b,c) nxt[++cnt]=head[a],to[cnt]=b,w[cnt]=c,head[a]=cnt
signed main() {
//  freopen("path10.in","r",stdin);
    int n=read(),m=read(),k=read(),s=read(),t=read(),x,y,z;
    F(i,1,m) {
        x=read(),y=read(),z=read();
        add(x,y,z);
    }
    poi[0]=s;
    F(i,1,k) poi[i]=read();
    poi[++k]=t;
    F(i,0,k-1) F(j,1,n) dis[i][j]=3000000000ll;
    F(i,0,k-1) dij(i);
//  F(i,0,k) F(j,0,k) printf("dis[%d][%d]=%d\n",i,poi[j],dis[i][poi[j]]);
    dfs(1,0,0,k);
    if(ans==3000000000ll) printf("-1");
    else printf("%lld",ans);
    return 0;
}

T2 【NOIP2013模拟联考11】剑与魔法(dragons)

Solution

贪心,保留范围内最大的值,最后注意把剩下的都加上

Code

//By Menteur_Hxy
#include<queue>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define F(i,a,b) for(register int i=(a);i<=(b);i++)
#define R(i,a,b) for(register int i=(b);i>=(a);i--)
#define E(i,u) for(register int i=head[u];i;i=nxt[i])
using namespace std;
typedef pair<int,int> PII;

int read() {
    int x=0,f=1; char c=getchar();
    while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}
    while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
    return x*f;
}

const int N=200010;
char p[N];
int da[N],ans;

priority_queue<int,vector<int>,greater<int> > Q;
int main() {
    int n=read();
    F(i,1,n) scanf("\n"),p[i]=getchar(),da[i]=read();
//  F(i,1,n) cout<<p[i]<<" ";
    int tot=0;
    F(i,1,n) if(p[i]!='e') tot++;
    if(tot<da[n]) {
        printf("-1");
        return 0;
    }
    F(i,1,n-1) {
        if(p[i]=='c') Q.push(da[i]);
        else {
            while(Q.size()>da[i]-1) {
                if(Q.empty()) {
                    printf("-1");
                    return 0;
                }
                Q.pop();
            }
        }
    }
    while(!Q.empty()) ans+=Q.top(),Q.pop();
    printf("%d",ans);
    return 0;
}

T3 【NOIP2013模拟联考13】三角形(triangle)

Solution

枚举一个点,算出另外n-1个点关于它的斜率并统计答案

Code

//By Menteur_Hxy
#include<queue>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define int long long
#define F(i,a,b) for(register int i=(a);i<=(b);i++)
#define R(i,a,b) for(register int i=(b);i>=(a);i--)
#define E(i,u) for(register int i=head[u];i;i=nxt[i])
using namespace std;
typedef pair<int,int> PII;

int read() {
    int x=0,f=1; char c=getchar();
    while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}
    while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
    return x*f;
}

const int N=3010;
int xi[N],yi[N];
double k[N];

signed main() {
    freopen("triangle.in","r",stdin);
    freopen("triangle.out","w",stdout);
    int n=read(),ans=n*(n-1)*(n-2)/6;
    F(i,1,n) xi[i]=read(),yi[i]=read();
    F(i,1,n) {
        int tot=0,reg=1;
        F(j,i+1,n) if(yi[i]!=yi[j]&&xi[i]!=xi[j]) k[++tot]=(double)(yi[j]-yi[i])/(xi[j]-xi[i]);
        sort(k+1,k+1+tot);
//      F(j,1,tot) cout<<k[j]<<" ";cout<<endl;
        F(j,2,tot) {
            if(k[j-1]==k[j]) reg++;
            if(k[j-1]!=k[j]||j==tot) ans-=reg*(reg-1)/2,reg=1;
        }
        reg=0;
        F(j,i+1,n) if(i!=j&&xi[i]==xi[j]) reg++;
        ans-=reg*(reg-1)/2;reg=0;
        F(j,i+1,n) if(i!=j&&yi[i]==yi[j]) reg++;
        ans-=reg*(reg-1)/2;reg=0;
    }
    printf("%lld",ans);
    return 0;
}
posted @ 2018-08-06 22:04 Menteur_Hxy 阅读( ...) 评论( ...) 编辑 收藏
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值