(Nowcoder) 第十五届浙大宁波理工校赛(A,B,D,E,F,H,I,J,K,L)

传送门

A.StarCraft

//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<string>
#include<cstring>
#include<algorithm>
#include<limits.h>
using namespace std;
typedef long long ll;
const ll INF=0x3f3f3f3f;
const ll inf=-0x3f3f3f3f; 
int n; 
int main(){
	cin>>n;
	cout<<1998+n<<endl;
	
	return 0;
}

B.Fibonacci and Counting

这道题的答案砍样例因该还是挺好猜的。其实就是gcd(F(x),F(x+1))先要变成gcd((F(x+1),F(x))),然后变成gcd(F(x),F(x-1)),因为斐波那契F(x+1)=F(x)+F(x-1),所以F(x+1)是肯定小于2*F(x),   F(x+1)%F(x)=F(x+1)-F(x)=F(x-1),gcd(F(x),F(x-1))变成gcd(2,1)->gcd(1,0),需要n次,在加一次交换位置,n+1.

//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<string>
#include<cstring>
#include<algorithm>
#include<limits.h>
using namespace std;
typedef long long ll;
const ll INF=0x3f3f3f3f;
const ll inf=-0x3f3f3f3f; 
int T,n;
int main(){
	scanf("%d",&T);
	while(T--){
		cin>>n;
		cout<<n+1<<endl;	
	}
	return 0;
}

C.LCPS

菜.jpg;

D.Campaign

七层循环暴力枚举就可以了,优雅一点就深搜

//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<string>
#include<cstring>
#include<algorithm>
#include<limits.h>
using namespace std;
typedef long long ll;
const ll INF=0x3f3f3f3f;
const ll inf=-0x3f3f3f3f; 
long long L[10];
long long R[10];
int ans;
int n;
void dfs(int now, int step, long long ll, long long rr) {
        //现在点   第几步   到该点的总下线  到该点的总上限
    ll += L[now];
    rr += R[now];
    if (ll <= n && rr >= n){
    	ans = max(ans, step);
	}
    if(ll > n){
    	return ;
	}
    for (int i = now+1; i <= 7; ++i) {
        dfs(i, step+1, ll, rr);
    }
}
int main() {
    std::ios::sync_with_stdio(false);
    int T;
    cin >> T;
    while (T--) {
        ans = 0;
        cin >> n;
        for (int i = 1; i <= 7; ++i) {
            cin >> L[i] >> R[i];
        }
        for (int i = 1; i <= 7; ++i) {
            dfs(i, 1, 0, 0);
        }
        cout << ans << endl;
    }
    return 0;
}

E.Build Pylons

排个序,从前往后建造就行了。

//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<string>
#include<cstring>
#include<algorithm>
#include<limits.h>
using namespace std;
typedef long long ll;
const ll INF=0x3f3f3f3f;
const ll inf=-0x3f3f3f3f; 
const int maxn = 1e3+5;
ll pos[maxn];
ll dis[maxn];
int main() {
	std::ios::sync_with_stdio(false);
	int T;
	cin >> T;
	while (T--) {
		int n, k;
		cin >> n >> k;
		for (int i = 1; i <= n; ++i) {
			cin >> pos[i];
		}
		sort(pos+1, pos+1+n);
		ll ans = 0;
		for (int i = 2; i <= n; ++i) {
			int dis = pos[i] - pos[i-1];
			ll tmp = 0;
			ll tired = 0;
			while (dis) {
				tmp += tired*2+1;
				dis--;
				tired++;
			}
			ans += tmp;
		}
		cout << ans + k << endl;
	}
	return 0;
}

F.Pylon Link

二分答案半径,用并查集来维护,如果两点距离小于2*R,那就将他们联通,最后检验是不是都被联通了。爆int还wa了好几发

//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<string>
#include<cstring>
#include<algorithm>
#include<limits.h>
using namespace std;
typedef long long ll;
const double inf=2e11;
const int maxn=500+50;
double x[maxn],y[maxn],dis[maxn][maxn];
int f[maxn],n;
int find(int x) {
	if(f[x]==x) return f[x];
	else return f[x]=find(f[x]);
}

inline void unity(int x,int y) {
	int u=find(x),v=find(y);
	f[u]=v;
}

bool check(long long mid) {
	for(int i=0; i<maxn; i++) f[i]=i;
	for(int i=1; i<=n; i++) {
		for(int j=i+1; j<=n; j++) {
			if(dis[i][j]<=2*mid) {
				if(find(i)!=find(j))
					unity(i,j);
			}
		}
	}

	int ff=find(1);
	for(int i=2; i<=n; i++) {
		if( find(i)!=ff ) return false;
	}
	return true;
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int line;
	cin>>line;
	while(line--) {
		cin>>n;
		double L=inf,R=-1;
		for(int i=1; i<=n; i++)
			cin>>x[i]>>y[i];
		for(int i=1; i<=n; i++)
			for(int j=i+1; j<=n; j++) {
				dis[i][j]=sqrt( (x[i]-x[j])*(x[i]-x[j]) +(y[i]-y[j])*(y[i]-y[j]) );
				L=min(L,dis[i][j]);
				R=max(R,dis[i][j]);
			}
		ll l=0,r=inf;
		while(r>l) {
			ll mid=(l+r)>>1;
			if(check(mid)) r=mid;
			else l=mid+1;
		}
		cout<<l<<endl; 
		
	}
	return 0;
}

G.Rubik's Cube

菜.jpg

H.Protoss and Zerg

这个还是很好推的.

//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<string>
#include<cstring>
#include<algorithm>
#include<limits.h>
using namespace std;
typedef long long ll;
const ll INF=0x3f3f3f3f;
const ll inf=-0x3f3f3f3f; 
const ll mod=998244353;
ll fpow(ll x,ll y) {
	ll ans=1;
	while(y) {
		if(y&1) (ans*=x)%=mod;
		(x*=x)%=mod;
		y>>=1;
	}return ans%mod;
}
int main() {
	int line;
	scanf("%d",&line);
	while(line--) {
		int n;
		ll res=1;
		scanf("%d",&n);
		while(n--) {
			ll a,b;
			scanf("%lld%lld",&a,&b);
			res*=((fpow(2,a)-1)+(fpow(2,b)-1));
			res%=mod;
		}printf("%lld\n",res%mod);
	}
	return 0;
}

I.Race Sorting

模拟题

//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<string>
#include<cstring>
#include<algorithm>
#include<limits.h>
using namespace std;
typedef long long ll;
const ll INF=0x3f3f3f3f;
const ll inf=-0x3f3f3f3f; 
vector<int>t;
vector<int>z;
vector<int>p;
vector<int>ans;
int main() {
	std::ios::sync_with_stdio(false);
	int T;
	cin >> T;
	while (T--) {
		int rank[3];
		memset(rank, 0, sizeof(rank));
		t.clear();
		z.clear();
		p.clear();
		ans.clear();
		int n, tmp;
		string s;
		cin >> n;
		while (n--) {
			cin >> tmp >> s >> s;
			if (s == "Terran")
				t.push_back(tmp);
			else if (s == "Zerg")
				z.push_back(tmp);
			else
				p.push_back(tmp);
		}
		cin >> s;
		int pos1 = s.find(',');
		int pos2 = s.find(',', pos1+1);
		if (s[pos1-1] == 'g') {
			rank[2] = 1;
		} else if (s[pos1-1] == 'n') {
			rank[1] = 1;
		} else
			rank[0] = 1;

		if (s[pos2-1] == 'g') {
			rank[2] = 2;
		} else if (s[pos2-1] == 'n') {
			rank[1] = 2;
		} else
			rank[0] = 2;

		if (rank[0] == 1) {
			ans.insert(ans.end(), p.begin(), p.end());
		} else if (rank[1] == 1) {
			ans.insert(ans.end(), t.begin(), t.end());
		} else
			ans.insert(ans.end(), z.begin(), z.end());

		if (rank[0] == 2) {
			ans.insert(ans.end(), p.begin(), p.end());
		} else if (rank[1] == 2) {
			ans.insert(ans.end(), t.begin(), t.end());
		} else
			ans.insert(ans.end(), z.begin(), z.end());

		if (rank[0] == 0) {
			ans.insert(ans.end(), p.begin(), p.end());
		} else if (rank[1] == 0) {
			ans.insert(ans.end(), t.begin(), t.end());
		} else
			ans.insert(ans.end(), z.begin(), z.end());

		for (int i = 0; i < ans.size(); ++i) {
			if (i)
				cout << " ";
			cout << ans[i];
		}
		cout << endl;
	}
	return 0;
}

J.Carrier

签到题

//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<string>
#include<cstring>
#include<algorithm>
#include<limits.h>
using namespace std;
typedef long long ll;
const ll INF=0x3f3f3f3f;
const ll inf=-0x3f3f3f3f; 
int main() {
	int T;
	cin>>T;
	while(T--) {
		int a,b,x,y;
		cin>>a>>b>>x>>y;
		if(a<350) {
			cout<<"You have not enough minerals."<<endl;
			continue;
		} else if(b<250) {
			cout<<"You require more vespene gas."<<endl;
			continue;
		} else if(x+6>y) {
			cout<<"You must construct additional pylons."<<endl;
			continue;
		} else {
			cout<<"Carrier has arrived."<<endl;
			continue;
		}
	}
	return 0;
}

K.Technology Tree

深搜一下,记录每个点的需要的矿和瓦斯

//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<string>
#include<cstring>
#include<algorithm>
#include<limits.h>
using namespace std;
typedef long long ll;
const ll INF=0x3f3f3f3f;
const ll inf=-0x3f3f3f3f;
const int maxn=2e4+5;
int T,n,q;
int f[maxn];
struct PP {
	int k;
	int w;
};
vector<int> e[maxn];
PP m[maxn];
PP res[maxn];
int degree[maxn];
bool vis[maxn];
PP dfs(int s) {
	if(vis[s]){
		return res[s];
	}
	if(f[s]==s) {
		return PP {m[s].k,m[s].w};
	} else {
		PP tmp=dfs(f[s]);
		res[s]=PP{tmp.k+m[s].k,tmp.w+m[s].w};
		vis[s]=true;
		return res[s];
	}

}
int main() {
	scanf("%d",&T);
	while(T--) {
		scanf("%d%d",&n,&q);
		for(int i=1; i<=n; ++i) {
			cin>>m[i].k>>m[i].w;
			if(i==1) {
				res[i].k=m[i].k;
				res[i].w=m[i].w;
			}
		}
		memset(vis,false ,sizeof(vis));
		for(int i=2; i<=n; ++i) {
			cin>>f[i];
		}

		for(int i=2; i<=n; ++i) {
			if(!vis[i]){
				res[i]=dfs(i);
				vis[i]=true;
			}
			
		}

		int x;
		for(int i=1; i<=q; ++i) {
			cin>>x;
			cout<<res[x].k<<' '<<res[x].w<<endl;
		}
	}

	return 0;
}

L.The Last Stand

//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<string>
#include<cstring>
#include<algorithm>
#include<limits.h>
using namespace std;
typedef long long ll;
const ll INF = 0x3f3f3f3f;
const ll inf = -0x3f3f3f3f; 
const int maxn = 1e3+5;
ll dp[maxn][maxn];
//到i点  状态为j  的生命值 
ll val[maxn];
ll delta[maxn];
ll pos[maxn];
ll dis[maxn];
int main() {
	std::ios::sync_with_stdio(false);
	int T;
	cin >> T;
	while (T--) {
		ll n, m;
		memset(dp, 0, sizeof(dp));
		cin >> n >> m >> dp[0][0];
		for (int i = 1; i <= n; ++i) {
			cin >> pos[i] >> val[i] >> delta[i];
			dis[i] = pos[i] - pos[i-1];
		}
		dis[n+1] = m-pos[n];
		for (int j = 1; j <= n; ++j)
			dp[0][j] = dp[0][0];
			
		for (int i = 1; i <= n; ++i) {
			for (int j = 0; j < i; ++j) {
				if (dp[i-1][j] > 0) {
					dp[i][j] = dp[i-1][j] + dis[i]*delta[j];
				}
				
				if (dp[i][j] < 1)
					dp[i][j] = inf;
				if (dp[i][j] > 0)
					dp[i][i] = max(dp[i][i], dp[i][j] + val[i]);
				if (dp[i][i] < 1)
					dp[i][i] = inf;
			}
		}
		ll ans = 0;
		for (int j = 0; j <= n; ++j) {
			if (dp[n][j] > 0)
				ans = max(ans, dp[n][j] + dis[n+1]*delta[j]);
		}
		cout << ans << endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/TDD_Master/article/details/84895345