2022年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛(重现赛)

目录

A+B Problem

Komorebi的数学课

次佛锅

Setsuna的K数列

黄金律法

天气预报

史东薇尔城


A+B Problem

思路:
分两种情况:
1.除了最大的数 其他的都是与最大的数的和最大
2.最大的数与第二大的数的和最大

#include<bits/stdc++.h>
#define endl '\n'
#define mk make_pair
#define int long long
using namespace std;
const int M=1e5 + 10;
const int N=2e6+10;

const int inf=LLONG_MAX/2;

void solve() {

	int n;
	cin>>n;
	vector<int>a(n),b(n);
	for(int i=0;i<n;i++){
		cin>>a[i];
		b[i]=a[i];
	}
	sort(b.begin(),b.end());
	for(int i=0;i<n;i++){
		if(a[i]!=b[n-1]){
			a[i]+=b[n-1];
		}else{
			a[i]+=b[n-2];
		}
	}
	for(int i=0;i<n;i++){
		cout<<a[i]<<" ";
	}
}

signed main()
{	
	ios::sync_with_stdio(false), cin.tie(0),cout.tie(0); 
	int t = 1;
//	cin>>t;
	while (t--){
		solve();
	}
	return 0;
}

Komorebi的数学课

快速幂的典型板子题,define int long long

#include<bits/stdc++.h>
#define endl '\n'
#define mk make_pair
#define int long long
using namespace std;
const int M=1e5 + 10;
const int N=2e6+10;

const int inf=LLONG_MAX/2;

int power(int a, int b,int p) {
	int res = 1;
	for (; b; b /= 2, a = 1LL * a * a % p) {
		if (b % 2) {
			res = 1LL * res * a % p;
		}
	}
	return res;
}



void solve() {

	int n;
	cin>>n;
	int x=power(n,n,n+2);
	cout<<x<<endl;
}

signed main()
{	
	ios::sync_with_stdio(false), cin.tie(0),cout.tie(0); 
	int t = 1;
//	cin>>t;
	while (t--){
		solve();
	}
	return 0;
}

次佛锅

字符子串后面一定接的是数字字串,所以直接用一个map接收就好了。

#include<bits/stdc++.h>
#define endl '\n'
#define mk make_pair
#define int long long
using namespace std;
const int M=1e5 + 10;
const int N=2e6+10;

const int inf=LLONG_MAX/2;

int power(int a, int b,int p) {
	int res = 1;
	for (; b; b /= 2, a = 1LL * a * a % p) {
		if (b % 2) {
			res = 1LL * res * a % p;
		}
	}
	return res;
}


void solve() {

	int n;
	string s;
	getline(cin,s);
	n=s.size();
	int t;
	cin>>t;
	vector<string>q(t);
	vector<int>len(t);
	for(int i=0;i<t;i++){
		cin>>q[i];
		len[i]=q[i].size();
	}
	map<string,int>u;
	string ss="",sz="";
	s=" "+s;
	s=s+" ";
	n+=2;
	for(int i=0;i<=n;i++){
		if(s[i]==' '){
			if(sz.size()!=0 and ss.size()!=0){
				int x=stoi(ss);
				u[sz]+=x;
				sz="",ss="";
			}
		}if((s[i]>='a' and s[i]<='z') or (s[i]>='A' and s[i]<='Z')){
			sz+=s[i];
		}if(s[i]>='0' and s[i]<='9'){
			ss+=s[i];
		}
	}
	
	for(int i=0;i<t;i++){
		cout<<u[q[i]]<<endl;
	}
	
}

signed main()
{	
	ios::sync_with_stdio(false), cin.tie(0),cout.tie(0); 
	int t = 1;
//	cin>>t;
	while (t--){
		solve();
	}
	return 0;
}

Setsuna的K数列

找规律 二进制

如果当前的数遍历二进制时此位置是1那么就然他加上 power(k,下标-1)。规律未知,真正的规律是保留计算各个位置上1的个数。

#include<bits/stdc++.h>
#define endl '\n'
#define mk make_pair
#define int long long
using namespace std;
const int M=1e5 + 10;
const int N=2e6+10;
const int mod=1e9+7;
const int inf=LLONG_MAX/2;

int power(int a, int b,int p) {
	int res = 1;
	for (; b; b /= 2, a = 1LL * a * a % p) {
		if (b % 2) {
			res = 1LL * res * a % p;
		}
	}
	return res;
}



void solve() {
	int n,k;
	cin>>n>>k;
	int ans=0;
	for(int i=1;i<32;i++){
		if(((n>>(i-1))&1)==1){
			int x=power(k,i-1,mod);
			x%=mod;
			ans+=x;
			ans%=mod;
		}
	}
	cout<<ans<<endl;
}
signed main()
{	
	ios::sync_with_stdio(false), cin.tie(0),cout.tie(0); 
	int t = 1;
	//cin>>t;
	while (t--){
		solve();
	}
	return 0;
}

黄金律法

两个分别从大到小 ,从小到大排序,输出乘法和就好。

#include<bits/stdc++.h>
#define endl '\n'
#define mk make_pair
#define int long long
using namespace std;
const int M=1e5 + 10;
const int N=2e6+10;

const int inf=LLONG_MAX/2;

int power(int a, int b,int p) {
	int res = 1;
	for (; b; b /= 2, a = 1LL * a * a % p) {
		if (b % 2) {
			res = 1LL * res * a % p;
		}
	}
	return res;
}



void solve() {
	
	int n;
	cin>>n;
	vector<int>w(n),m(n);
	for(int i=0;i<n;i++){
		cin>>w[i];
	}
	for(int i=0;i<n;i++){
		cin>>m[i];
	}
	
	sort(w.begin(),w.end());
	sort(m.begin(),m.end());
	reverse(m.begin(),m.end());
	int sum=0;
	for(int i=0;i<n;i++){
		sum+=w[i]*m[i];
	}
	cout<<sum<<endl;
	
}

signed main()
{	
	ios::sync_with_stdio(false), cin.tie(0),cout.tie(0); 
	int t = 1;
	cin>>t;
	while (t--){
		solve();
	}
	return 0;
}

天气预报

可以理解,当一个子区间满足了,那么就把后面所有的数的个数都加在结果上,因为他们一定满足。反之扩大区间找满足就好了,若找到了,继续重复上一步。微调细节就好。

#include<bits/stdc++.h>
#define endl '\n'
#define mk make_pair
#define int long long
using namespace std;
const int M=1e5 + 10;
const int N=2e6+10;

const int inf=LLONG_MAX/2;

int power(int a, int b,int p) {
	int res = 1;
	for (; b; b /= 2, a = 1LL * a * a % p) {
		if (b % 2) {
			res = 1LL * res * a % p;
		}
	}
	return res;
}



void solve() {
	int n,a,b;
	cin>>n>>a>>b;
	string s;
	cin>>s;
	int x=0,y=0;
	int ans=0;
	int i=0,j=0;
	while(i<n){
		while(j<n and (x<a or y<b)){
			if(s[j]=='0'){
				x++;
			}else{
				y++;
			}
			j++;
		}
		if(x>=a and y>=b){
			ans+=n-j+1;
		}
        if(s[i]=='0'){
            x--;
        }else{
            y--;
        }
		i++;
	}
	if(a==0 and b==0){
		ans-=n-1;
		cout<<ans<<endl;
		return;
	}
	cout<<ans<<endl;
}
signed main()
{	
	ios::sync_with_stdio(false), cin.tie(0),cout.tie(0); 
	int t = 1;
	//cin>>t;
	while (t--){
		solve();
	}
	return 0;
}

史东薇尔城

板子的板子。

#include<bits/stdc++.h>
#define endl '\n'
#define mk make_pair
#define int long long
using namespace std;
const int M=1e5 + 10;
const int N=2e5+10;

const int inf=LLONG_MAX/2;
struct node{
	int x,w;
};

int n,m;
int vis[N],dist[N];
vector<node>g[N];
void solve() {
	cin>>n>>m;
	while(m--){
		int x,y,w;
		cin>>x>>y>>w;
		g[x].push_back({y,w});
		g[y].push_back({x,w});
	}
	for(int i=1;i<=n;i++){
		dist[i]=inf;
	}
	dist[1]=0;
	priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>q;
	q.push({0,1});
	while(q.size()){
		auto[fw,dian]=q.top();
		q.pop();
		if(vis[dian])
			continue;
		vis[dian]=1;
		for(auto[x,w]:g[dian]){
			if(dist[x]>w+fw){
				dist[x]=w+fw;
				q.push({dist[x],x});
			}
		}
	}
	
	int k;
	cin>>k;
	while(k--){
		int c,d;
		cin>>c>>d;
		cout<<dist[c]+dist[d]<<endl;
	}
}	

signed main()
{	
	ios::sync_with_stdio(false), cin.tie(0),cout.tie(0); 
	int t = 1;
	//cin>>t;
	while (t--){
		solve();
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值