牛客假日团队赛15题解

A : A: A:

https://www.luogu.org/problem/P1053

#include<iostream>
#include<cstdio>
#include<ctype.h>
using namespace std;
inline int read(){
	int x=0,f=0;char ch=getchar();
	while(!isdigit(ch))f|=ch=='-',ch=getchar();
	while(isdigit(ch))x=x*10+(ch^48),ch=getchar();
	return f?-x:x;
}
bool vis[50007];
int c[50007],a[50007],aa[50007];
int d1[50007],d2[50007];
int n,ans=0;
inline void cir(){
	c[1]=1,c[2]=a[1];
	vis[c[1]]=vis[c[2]]=1;
	for(int i=2;i<=n-1;++i){
		if(c[i-1]==a[c[i]])c[i+1]=aa[c[i]],vis[c[i+1]]=1;
		else if(c[i-1]==aa[c[i]])c[i+1]=a[c[i]],vis[c[i+1]]=1;
		else puts("-1"),exit(0);
	}
	for(int i=1;i<=n;++i)if(!vis[i])puts("-1"),exit(0);
}
inline void work(){
	for(int i=1;i<=n;++i){
		d1[(c[i]-i+n)%n]++;
		d2[(c[n-i+1]-i+n)%n]++;
	}
	for(int i=0;i<=n-1;++i)ans=max(ans,max(d1[i],d2[i]));
	printf("%d\n",n-ans);
}
int main(){
	n=read();
	for(int i=1;i<=n;++i)a[i]=read(),aa[i]=read();
	cir();
	work();
	return 0;
}

B : B: B:

https://www.luogu.org/problem/P1607

#include<iostream>
#include<cstdio>
#include<ctype.h>
#include<algorithm>
using namespace std;
inline int read(){
	int x=0,f=0;char ch=getchar();
	while(!isdigit(ch))f|=ch=='-',ch=getchar();
	while(isdigit(ch))x=x*10+(ch^48),ch=getchar();
	return f?-x:x;
}
int ans,w[50007];
struct OOO{
	int u,v,c;
	bool operator <(OOO b)const{
		if(v!=b.v)return v<b.v;
		return u<b.u;
	}
}a[50007];
int main(){
	int k=read(),n=read(),m=read();
	for(int i=1;i<=k;++i)a[i].u=read(),a[i].v=read(),a[i].c=read();
	sort(a+1,a+1+k);
	for(int i=1;i<=k;++i){
		if(w[a[i].u]>=m)continue;
		int mi=1e9;
		for(int j=a[i].u;j<=a[i].v && mi>0;++j)mi=min(m-w[j],mi);
		if(mi>0) {
			if(mi>=a[i].c){
				ans+=a[i].c;
				for(int j=a[i].u;j<a[i].v;++j)w[j]+=a[i].c;
			}
			else{
				ans+=mi;
				for(int j=a[i].u;j<a[i].v;++j)w[j]+=mi;
			}
		}
	}
	printf("%d\n",ans);
	return 0;
}

C : C: C:

未找到原题

一句话题意:求高次函数零点

数据太大不得已写的 P y t h o n Python Python

# -*- coding: utf-8 -*-
eps = 1e-6
d = int(input())
a = [float(input()) for i in range(d + 1)][::-1]
l, r = -1e6, 1e6
def f(x) :
  ans = 0.
  for i in a : ans = ans * x + i
  return ans
if f(l) < -eps :
  for i in range(len(a)) : a[i] = -a[i]
while l + eps < r :
  mid = (l + r) / 2.
  if f(mid) > eps : l = mid
  else : r = mid
print int(l * 1000)

D : D: D:

打不开给的字典链接
留坑

E : E: E:

https://www.luogu.org/problem/P2939
分层图最短路裸题(数组要开 k + 1 k+1 k+1倍!)

#include<iostream>
#include<cstdio>
#include<ctype.h>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
typedef pair<int,int> pairs;
priority_queue<pairs,vector<pairs>,greater<pairs> > q;
inline int read(){
	int x=0,f=0;char ch=getchar();
	while(!isdigit(ch))f|=ch=='-',ch=getchar();
	while(isdigit(ch))x=x*10+(ch^48),ch=getchar();
	return f?-x:x;
}
int head[220007],cnt;
bool vis[220007];
int dis[220007];
int n,m,k,s=1,ans=99999999;
struct Edge{
	int next,to,w;
}edge[40000007];
inline void add_edge(int from,int to,int w){
	edge[++cnt].next=head[from];edge[cnt].w=w;
	edge[cnt].to=to;head[from]=cnt;
}
inline void dijkstra(){
	memset(dis,0x3f,sizeof dis);
	dis[s]=0;q.push(make_pair(dis[s],s));
	while(!q.empty()){
		int x=q.top().second;q.pop();
		if(vis[x])continue;vis[x]=1;
		for(int i=head[x];i;i=edge[i].next){
			int to=edge[i].to;
			if(dis[to]>dis[x]+edge[i].w){
				dis[to]=dis[x]+edge[i].w;
				q.push(make_pair(dis[to],to));
			}
		}
	}
}
int main(){
	n=read(),m=read(),k=read();
	for(int i=1;i<=m;++i){
		int u=read(),v=read(),w=read();
		add_edge(u,v+n,0),add_edge(v,u+n,0);
		for(int j=0;j<k;++j)add_edge(u+j*n,v+j*n+n,0),add_edge(v+j*n,u+j*n+n,0);
		for(int j=0;j<=k;++j){
			add_edge(u+j*n,v+j*n,w);
			add_edge(v+j*n,u+j*n,w);
		}
	}
	dijkstra();
	for(int i=1;i<=k+1;++i)ans=min(ans,dis[i*n]);
	printf("%d",ans);
	return 0;
}

F : F: F:

https://www.luogu.org/problem/P1051

#include<iostream>
#include<algorithm>
using namespace std;
struct node{
    char name[25],gb,xp;
    int exam,bj,lw,ans,sum;
}a[110];
int n,tot=0;
bool cmp(node x,node y){
    if(x.ans==y.ans)return x.sum<y.sum;
    else return x.ans>y.ans;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i].name>>a[i].exam>>a[i].bj>>a[i].gb>>a[i].xp>>a[i].lw;
        if(a[i].exam>80&&a[i].lw>=1)a[i].ans+=8000;
        if(a[i].exam>85&&a[i].bj>80)a[i].ans+=4000;
        if(a[i].exam>90)a[i].ans+=2000;
        if(a[i].xp=='Y'&&a[i].exam>85)a[i].ans+=1000;
        if(a[i].bj>80&&a[i].gb=='Y')a[i].ans+=850;
        a[i].sum=i;
        tot+=a[i].ans;
    }
    sort(a+1,a+n+1,cmp);
    cout<<a[1].name<<endl<<a[1].ans<<endl<<tot;
    return 0;
}

G : G: G:

简单递推

但并未找到原题

#include<iostream>
#include<cstdio>
#include<ctype.h>
using namespace std;
const int mod=5000011;
inline int read(){
	int x=0,f=0;char ch=getchar();
	while(!isdigit(ch))f|=ch=='-',ch=getchar();
	while(isdigit(ch))x=x*10+(ch^48),ch=getchar();
	return f?-x:x;
}
int f[100007]={1};
int main(){
	int n=read(),k=read();
	f[1]=2;
	for(int i=2;i<=n;++i)f[i]=(f[i-1]+f[max(i-k-1,0)])%mod;
	printf("%d\n",f[n]);
	return 0;
}

H : H: H:

https://www.luogu.org/problem/P2938

完全背包

#include<iostream>
#include<cstdio>
#include<ctype.h>
#include<cstring>
using namespace std;
inline int read(){
    int x=0,f=0;
    char ch=getchar();
    while(!isdigit(ch))f|=ch=='-',ch=getchar();
    while(isdigit(ch))x=x*10+(ch^48),ch=getchar();
    return f?-x:x;
}
int a[57][17],f[500007];
int main(){
    int s=read(),d=read(),m=read();
    for(int i=1;i<=s;++i)for(int j=1;j<=d;++j)a[i][j]=read();
    for(int k=2;k<=d;++k){
        memset(f,0,sizeof f);
        int mx=0;
        for(int i=1;i<=s;++i){
            for(int j=a[i][k-1];j<=m;++j){
                f[j]=max(f[j],f[j-a[i][k-1]]+a[i][k]-a[i][k-1]);
                mx=max(f[j],mx);
            }
        }
        m+=mx;
    }
    printf("%d",m);
    return 0;
}

I : I: I:

https://www.luogu.org/problem/P2941

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <queue>
#define min(x,y)(x<y?x:y)
#define re register
#define For(a,b,c) for(register int a = b;a <= c; a++)
#define IL inline
char xB[1 << 15], *xS = xB, *xT = xB;
#define getchar()(xS==xT&&(xT=(xS=xB)+fread(xB,1,1<<15,stdin),xS==xT)?0:*xS++)
 
using namespace std;
 
typedef long long LL;
IL int read() {
    re int ret = 0; re bool flag = 0; re char c = getchar();
    while ((c < '0') | (c > '9')) flag ^= !(c^'-'), c = getchar();
    while ((c >= '0') & (c <= '9')) ret = (ret << 3) + (ret << 1) + (c^'0'), c = getchar();
    return flag ? -ret : ret;
}
inline void Put(char * s) { puts(s); }
inline void Put(char c) { Put(&c); }
inline void Put(LL x) { char c[25] = {0}; sprintf(c, "%lld", x); Put(c); }
inline void Put(int x) { Put(x | 0LL); }
 
const int N = 500 + 10;
const int M = 25 * 1e4;
const int INF = 66666666;
 
int n, Low[N], Dfn[N], Nxt[M], Fir[N], To[M], Kind;
int Clock, Tot, Ql[N], Dis[N][N], Stack[N], Top, Ans;
 
IL void Add_edge(int x, int y) { Nxt[++Tot] = Fir[x], To[Tot] = y, Fir[x] = Tot; }
 
IL void init() {
    n = read();
    For(i, 1, n) {
        int x = read(), y = read();
        Add_edge(x, y);
        Add_edge(y, x);
    }
}
 
void Tarjan(int Now) {
    Low[Now] = Dfn[Now] = ++Clock;
    Stack[++Top] = Now;
    for (int i = Fir[Now]; i; i = Nxt[i]) {
        int Go = To[i];
        if (!Dfn[Go]) {
            Tarjan(Go);
            Low[Now] = min(Low[Now], Low[Go]);
        } else if (!Ql[Go])
            Low[Now] = min(Low[Now], Dfn[Go]);
    }
    if (Low[Now] == Dfn[Now]) {
        Ql[Now] = ++Kind;
        while (Stack[Top] != Now) {
            Ql[Stack[Top]] = Kind;
            Top--;
        }
        Top--;
    }
}
 
IL void solve() {
    memset(Dis, 10, sizeof(Dis));
 
    For(i, 1, n)
    if (!Dfn[i])
        Tarjan(i);
    For(i, 1, n)
    For(j, 1, n) {
        int Val = read();
        Dis[Ql[i]][Ql[j]] = min(Dis[Ql[i]][Ql[j]], Val);
    }
    int Tmp = 0;
    Ans = INF;
 
    For(i, 1, Kind) {
        For(j, 1, Kind) {
            if (i == j) continue;
            Tmp += Dis[i][j];
        }
        Ans = min(Ans, Tmp);
        Tmp = 0;
    }
    Put(Ans << 1);
}
 
int main(void) {
    init();
    solve();
    return 0;
}

J : J: J:

https://www.luogu.org/problem/P2940

#include<bits/stdc++.h>
using namespace std;
 
int w, x, y, z, n;
int a[201][201], maxx = -10000000;
 
int main() {
    cin >> n;
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < n; ++j)
            cin >> a[i][j];
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < n; ++j, w = 0, x = 0, y = 0, z = 0)
            for (int k = 0; k < n; ++k) {
                w += a[i][(j + k) % n];
                x += a[(i + k) % n][j];
                y += a[(i + k) % n][(j + k) % n];
                z += a[(i - k + n) % n][(j + k) % n];
                maxx = max(max(max(w, x), max(y, z)), maxx);
            }
    cout << maxx;
}

K : K: K:

https://www.luogu.org/problem/P1052

#include<iostream>
#include<ctype.h>
#include<cstdio>
#include<algorithm>
using namespace std;
inline int read(){
    int x=0,f=0;char ch=getchar();
    while(!isdigit(ch))f|=ch=='-',ch=getchar();
    while(isdigit(ch))x=x*10+(ch^48),ch=getchar();
    return f?-x:x;
}
int f[3007],a[207];
bool b[3007];
int main(){
    int L=read(),s=read(),t=read(),m=read(),now=0,last=0;
    for(int i=1;i<=m;++i)a[i]=read();
    sort(a+1,a+m+1);
    for(int i=1;i<=m;++i){
        if(a[i]>a[i-1]+t+t)now+=t+t+(a[i]-a[i-1])%t;
        else now+=a[i]-a[i-1];
        b[now]=1;
    }
    if(L>now+t+t+1)L=now+t+t;
    for(int i=1;i<=L+t;++i)f[i]=99999999;
    for(int i=1;i<=L+t;++i){
        for(int j=s;j<=t;++j){
            if(i>=j)f[i]=min(f[i],f[i-j]+b[i]);
        }
    }
    int minn=f[L];
    for(int i=L+1;i<=L+t;++i)minn=min(minn,f[i]);
    printf("%d",minn);
    return 0;
}

L : L: L:

懒得写高精,所以还是 P y t h o n Python Python(注: P y t h o n 3 Python3 Python3

mod = 10000000000000000000000000000000000000000000000000000000000000000000000
def qpow(a, b):
    ans = 1
    while b != 0:
        if b & 1:
            ans = (ans * a) % mod
        b = b // 2
        a = (a * a) % mod
    return ans
a = input().split()
print(qpow(int(a[0]), int(a[1])))
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值