河南萌新联赛2024第(三)场:河南大学

圆周率日挑战

我要学python。

from decimal import Decimal, getcontext
import math


def find_most_circle(N, circles):

    best_P2 = Decimal(circles[0][0])
    best_4A = Decimal(circles[0][1])
    smallest_P = Decimal(circles[0][0])

    pi_value = Decimal('3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068')
    if best_P2 / best_4A >= pi_value:
        closest_to_pi = Decimal(best_P2 / best_4A - pi_value)
    else :
        closest_to_pi = Decimal(pi_value-best_P2 / best_4A)
    for circle in circles:
        P = Decimal(circle[0])  # 周长
        A = Decimal(circle[1])  # 面积

        # 计算 P^2 和 4A
        P2 = P**2
        four_A = 4 * A

        # 找出最接近π的比率
        ratio = P / A

        # 找出最接近π的比率
        difference = abs(ratio - pi_value)

        if difference < closest_to_pi:
            closest_to_pi = difference
            best_P2 = P
            best_4A = A
            smallest_P = P
        if difference == closest_to_pi and P < smallest_P:
            closest_to_pi = difference
            best_P2 = P
            best_4A = A
            smallest_P = P

    return best_P2, best_4A, smallest_P


if __name__ == "__main__":
    N = int(input())
    circles = [tuple(map(int, input().split())) for _ in range(N)]

        # 设置Decimal精度
    getcontext().prec = 110

    best_P2, best_4A, smallest_P = find_most_circle(N, circles)

    print(f"{best_P2} {best_4A}")

 正则表达式

模拟,模拟就好

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

//判断是否是一个素数  Mark 标记数组 index 素数个数  
int Prime();

int gcd(int a,int b){
	return b==0?a:gcd(b,a%b);
}
int lcm(int a,int b){
	return a*b/gcd(a,b);
}



void solve() {
	int n;
	cin>>n;
	int sum=0;
	
	for(int i=0;i<n;i++){
		int a,b,c,d;
		char x;
		cin>>a>>x>>b>>x>>c>>x>>d;
		if(a>=0 and a<=255 and b>=0 and b<=255 and c>=0 and c<=255 and d>=0 and d<=255){
			sum++;	
		}
	}
	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;
}

int Prime(){  
	int index = 0;  
	for(int i = 2; i < MAXSIZE; i++){  
		//如果未标记则得到一个素数  
		if(Mark[i] == 0) prime[++index] = i;  
		//标记目前得到的素数的i倍为非素数  
		for(int j = 1; j <= index && prime[j] * i < MAXSIZE; j++){  
			Mark[i * prime[j]] = 1;  
			if(i % prime[j] == 0) break;  
		}  
	}  
	return index;  
}

Circle

这个题,你画一画就好,三个肯定时题里的情况,4个你就在正中间加个圆。数!14出了,大胆点,不大胆搜一下,直接硬找规律。0的情况特判。

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

//判断是否是一个素数  Mark 标记数组 index 素数个数  
int Prime();

int gcd(int a,int b){
	return b==0?a:gcd(b,a%b);
}
int lcm(int a,int b){
	return a*b/gcd(a,b);
}



void solve() {
	
	int n;
	cin>>n;
	if(n==0){
		cout<<'1'<<" ";
	}else{
		cout<<n*(n-1)+2<<" ";
	}
	
	
}	

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

int Prime(){  
	int index = 0;  
	for(int i = 2; i < MAXSIZE; i++){  
		//如果未标记则得到一个素数  
		if(Mark[i] == 0) prime[++index] = i;  
		//标记目前得到的素数的i倍为非素数  
		for(int j = 1; j <= index && prime[j] * i < MAXSIZE; j++){  
			Mark[i * prime[j]] = 1;  
			if(i % prime[j] == 0) break;  
		}  
	}  
	return index;  
}

累加器

同样硬找的规律,我直接哪20,40这个例子找的,发现就是用二进制的1位来决定结果。下标i从1开始,如果当前为1,那么加上2^i-1。原因不明。眼睛好。

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

//判断是否是一个素数  Mark 标记数组 index 素数个数  
int Prime();

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

int gcd(int a,int b){
	return b==0?a:gcd(b,a%b);
}
int lcm(int a,int b){
	return a*b/gcd(a,b);
}

void solve() {
	int x,y;
	cin>>x>>y;
	y+=x;
	int x1=x,y1=y;
	string s1="",s2="";
	while(x1!=0){
		int z=x1&1;
		if(z==1){
			s1="1"+s1;
		}else{
			s1="0"+s1;
		}
		x1>>=1;
	}
	while(y1!=0){
		int z=y1&1;
		if(z==1){
			s2="1"+s2;
		}else{
			s2="0"+s2;
		}
		y1>>=1;
	}
	
	s1+='*',s2+='*';
	int sum1=0,sum2=0;
	int n1=s1.size(),n2=s2.size();
	reverse(s1.begin(),s1.end());reverse(s2.begin(),s2.end());
	for(int i=1;i<=n1;i++){
		if(s1[i]=='1'){
			sum1+=power(2,i)-1;
		}
	}
	for(int i=1;i<=n2;i++){
		if(s2[i]=='1'){
			sum2+=power(2,i)-1;
		}
	}
	cout<<sum2-sum1<<endl;
}	

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

int Prime(){  
	int index = 0;  
	for(int i = 2; i < MAXSIZE; i++){  
		//如果未标记则得到一个素数  
		if(Mark[i] == 0) prime[++index] = i;  
		//标记目前得到的素数的i倍为非素数  
		for(int j = 1; j <= index && prime[j] * i < MAXSIZE; j++){  
			Mark[i * prime[j]] = 1;  
			if(i % prime[j] == 0) break;  
		}  
	}  
	return index;  
}

游戏

迪杰斯特拉的板题,我到现在还没背过。今年的睿抗国赛。。。。。。啊啊啊,死了。睿抗的D题,。。。没写。。。。。没事,没事。。。。。。。。。。。。没事。。。。。来两个迪杰斯特拉就好。一开始从起点开始。只走没封闭的道路。如果可以到达K点,那么就要再来一次,判断所有道路都可走的情况下,新的最短距离是多少。走就好。走就好。记得第二次要重新把更改后的状态还原。

#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,op;
};

int n,m,k;
int vis[N],dist[N];
vector<node>g[N];

void solve() {
	cin>>n>>m>>k;
	while(m--){
		int x,y,w,op;
		cin>>x>>y>>w>>op;
		g[x].push_back({y,w,op});
		g[y].push_back({x,w,op});
	}
	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,op]:g[dian]){
			if(op==0){
				continue;
			}
			if(dist[x]>w+fw){
				dist[x]=w+fw;
				q.push({dist[x],x});
			}
		}
	}
	
	if(dist[k]==inf and dist[n]==inf){
		cout<<"-1\n";
		return;
	}
	int ans=dist[n];
	if(dist[k]!=inf){
		for(int i=1;i<=n;i++){
			if(i!=k){
				dist[i]=inf;
			} 
			vis[i]=0;
		}
		priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>q;
		q.push({dist[k],k});
		while(q.size()){
			auto[fw,dian]=q.top();
			q.pop();
			if(vis[dian])
				continue;
			vis[dian]=1;
			for(auto[x,w,op]:g[dian]){
				if(dist[x]>w+fw){
					dist[x]=w+fw;
					q.push({dist[x],x});
				}
			}
		}

	}
	ans=min(ans,dist[n]);
	if(ans==inf){
		ans=-1;
	}
	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;
}

keillempkill学姐の卷积

模拟无感了。

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

//判断是否是一个素数  Mark 标记数组 index 素数个数  
int Prime();

int gcd(int a,int b){
	return b==0?a:gcd(b,a%b);
}
int lcm(int a,int b){
	return a*b/gcd(a,b);
}

int a[50][50],b[50][50];
int c[50][50];
void solve() {
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>a[i][j];
		}
	}
	for(int i=1;i<=m;i++){
		for(int j=1;j<=m;j++){
			cin>>b[i][j];
		}
	}
	int xx=m-n+1;
	for(int i=1;i<=m-n+1;i++){
		for(int j=1;j<=m-n+1;j++){
			int sum=0;
			for(int i1=0;i1<n;i1++){
				for(int j1=0;j1<m;j1++){
					sum+=b[i+i1][j+j1]*a[i1+1][j1+1];
				}
			}
			c[i][j]=sum;
		}
	}
	for(int i=1;i<=xx;i++){
		for(int j=1;j<=xx;j++){
			cout<<c[i][j]<<" ";
		}
		cout<<endl;
	}
}	

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

int Prime(){  
	int index = 0;  
	for(int i = 2; i < MAXSIZE; i++){  
		//如果未标记则得到一个素数  
		if(Mark[i] == 0) prime[++index] = i;  
		//标记目前得到的素数的i倍为非素数  
		for(int j = 1; j <= index && prime[j] * i < MAXSIZE; j++){  
			Mark[i * prime[j]] = 1;  
			if(i % prime[j] == 0) break;  
		}  
	}  
	return index;  
}

SSH

同无感的模拟。我不能这样下去。我kao。我一开始是把用户作为主体,然后WA,第二次按题意,把主机作为主体,才过掉。就这样吧。应该是”不同主机“用户分开——“判断该 IPv4 地址对应的主机上的用户”。这个条件产生了一些差错。

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

//判断是否是一个素数  Mark 标记数组 index 素数个数  
int Prime();

int gcd(int a,int b){
	return b==0?a:gcd(b,a%b);
}
int lcm(int a,int b){
	return a*b/gcd(a,b);
}



struct yonghu{
	string name;
	int t;
	map<string,int>gongshi;
};
struct zhuji{
	string dizhi;
	int k;
	vector<yonghu>ren;
};

void solve() {
	map<string,string>u;//私是对应的共识。
	int m,n,q;
	cin>>m>>n>>q;
	for(int i=0;i<m;i++){
		string a,b;//gong si
		cin>>a>>b;
		u[b]=a;
	}
	vector<zhuji>a;
	for(int i=0;i<n;i++){
		zhuji x;
		cin>>x.dizhi;
		cin>>x.k;
		for(int j=0;j<x.k;j++){
			yonghu y;
			cin>>y.name>>y.t;
			for(int z=0;z<y.t;z++){
				string ss;
				cin>>ss;
				y.gongshi[ss]++;
			}
			x.ren.push_back(y);
		}
		a.push_back(x);
	}	
	//zhujiyouNge;
	for(int i=0;i<q;i++){
		string user,ip,pri;
		cin>>user>>ip>>pri;
		int k1=0;
		for(int j=0;j<n;j++){
			if(a[j].dizhi==ip){
				for(int z=0;z<a[j].k;z++){
					if(a[j].ren[z].name==user){
						if(a[j].ren[z].gongshi[u[pri]]!=0){
							k1=1;
							break;
						}
					}
				}
				if(k1==1){
					break;
				}
			}
		}
		if(k1==1){
			cout<<"Yes"<<endl;
		}else{
			cout<<"No"<<endl;
		}
	}
	
}	

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

int Prime(){  
	int index = 0;  
	for(int i = 2; i < MAXSIZE; i++){  
		//如果未标记则得到一个素数  
		if(Mark[i] == 0) prime[++index] = i;  
		//标记目前得到的素数的i倍为非素数  
		for(int j = 1; j <= index && prime[j] * i < MAXSIZE; j++){  
			Mark[i * prime[j]] = 1;  
			if(i % prime[j] == 0) break;  
		}  
	}  
	return index;  
}

暴食之史莱姆

考虑一个史莱姆能吃掉的最大应该为两侧小于它体积的第一个的史莱姆能吃掉的个数 + 1。

因为吃掉这个更小的史莱姆后其体积就会变成这个小史莱姆的体积,所以小史莱姆能吃多少,那么它就能吃多少,在此基础上还能吃掉小史莱姆。

固定一边,用单调栈维护一下该边比当前史莱姆更小的第一个位置即可。

#include<bits/stdc++.h>
#define endl '\n'
#define mk make_pair
#define int long long
using namespace std;
const int N = 1e5 + 10;
const int MAXSIZE=1e5;
void solve() {
	int n;
	cin >> n;
	vector<int> a(n + 1);
	for(int i = 1;i <= n;i ++) cin >> a[i];
	
	vector<int> res;
	vector<int> ans(n + 1);
	for(int i = 1;i <= n;i ++)
	{
		while(res.size() && res.back() > a[i]) res.pop_back();
		ans[i] = res.size();
		res.push_back(a[i]);
	}
	
	while(res.size()) res.pop_back();
	for(int i = n;i >= 1;i --)
	{
		while(res.size() && res.back() > a[i]) res.pop_back();
		ans[i] += res.size();
		res.push_back(a[i]);
	}
	
	for(int i = 1;i <= n;i ++) cout << ans[i] <<" ";
	cout << endl;
}	

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

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值