【SSL】2020.10.16

T1 小 X 的加法难题

在这里插入图片描述

解题思路

无脑题目,字符串输入去空格,判断一下就好了。

code

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;

long long a,b,ans,n;

string h;

long long input()
{
    
    
	long long i=0,la,lb;
	while(h[i]!='+')
	{
    
    
		if(h[i]>='0'&&h[i]<='9')
		{
    
    
			a*=10;
			a+=h[i]-'0';
			la++;
			if(la==9)
			{
    
    
				cout<<"Large"<<endl;
				return -1;
			}
		}
		i++;
	}
	i++;
	while(i<n)
	{
    
    
		if(h[i]>='0'&&h[i]<='9')
		{
    
    
			b*=10;
			b+=h[i]-'0';
			lb++;
			if(lb==9)
			{
    
    
				cout<<"Large"<<endl;
				return -1;
			}
		}
		i++;
	}
	return a+b;
}

int main()
{
    
    
	freopen("sum.in","r",stdin);
	freopen("sum.out","w",stdout);
	getline(cin,h);
	n=h.size();
	ans=input();
	if(ans==-1)
		return 0;
	if(ans>100000000)
		cout<<"Large"<<endl;
	else
		cout<<ans<<endl;
}

不开long long见祖宗


T2 小 X 的密码破译

在这里插入图片描述

解题思路

照着做就好了,桶拍,bool

code

#include<iostream>
#include<cstdio>
using namespace std;

long long n,a,b,c,ans,tot=1;
bool e[20000000];

int main()
{
    
    
	freopen("password.in","r",stdin);
	freopen("password.out","w",stdout);
	cin>>n>>a>>b>>c;
	for(int i=1;i<=n;i++)
	{
    
    
		long long t=(a*i*i+b*i+c)%11111111;
		e[t]=1;
	}
	for(int i=0;i<=11111111;i++)
		if(e[i])
		{
    
    
			ans=(ans+i*tot)%11111111;
			tot++;
		}
	cout<<ans<<endl;
}

“从零开始的循环” and “没开long long的悲哀”


T3 小 X 的液体混合

在这里插入图片描述

解题思路

我们可以把这张图想象成一个个集合,只有当这个集合中有点在容器中的时候才能产生反应,而且每个点只能倒一次。我们可以用dfs便利这张图,然后高精度就OK。

code

#include<iostream>
#include<cstdio>
using namespace std;

int n,m,b[1010];
int tot,hd[1010];
int h[1000],len=1;

struct abc{
    
    
	int to,next;
}s[1000001];

void add(int x,int y)
{
    
    
	s[++tot]=(abc){
    
    y,hd[x]};
	hd[x]=tot;
	s[++tot]=(abc){
    
    x,hd[y]};
	hd[y]=tot; 
}

void mi2()
{
    
    
	int x=0;
	for(int i=1;i<=len+1;i++)
	{
    
    
		h[i]=h[i]*2+x;
		x=h[i]/10;
		h[i]%=10;
	}
	if(h[len+1])
		len++;
}

void dfs(int now)
{
    
    
	b[now]=1;
	for(int i=hd[now];i;i=s[i].next)
		if(!b[s[i].to])
		{
    
    
			dfs(s[i].to);
			mi2();
		}
}

int main()
{
    
    
	freopen("mixture.in","r",stdin);
	freopen("mixture.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
    
    
		int x,y;
		scanf("%d%d",&x,&y);
		add(x,y);
	}
	h[1]=1;
	for(int i=1;i<=n;i++)
		if(!b[i])
			dfs(i);
	for(int i=len;i>=1;i--)
		cout<<h[i];
	cout<<endl;
	return 0;
}

一遍过,没什么好B的


T4 小 X 的 AK 计划

在这里插入图片描述

解题思路

这道题…是用贪心的算法,然后先这样,再那样就好了…(我绝对不是借鉴他人程序的)
上面什么都没发生,下面正文:
首先读入数据,处理一下从上一个机房走到本地点的路程(等会要用),然后按照当前地点到家的距离排序。

接下来就是求解部分:

首先,建立一个大根堆。然后遍历排好序的数据,要是这个房间能 AK ,那就 AK 了再走呗。要是这个机房时间不够了,就从原来那里找一个时间最大的,运用奥义·返还时间,把时间拿回来给这个机房AK。在这个过程中,要不断取\maxmax。

在决策过程中,要是出现就算怎么反还时间也不够的话,说明后面的你压根就 AK 不了,所以明智的结束装B循环。

code

#include<bits/stdc++.h>
#define pi pair<long long,long long>
using namespace std;

long long n,m;
long long now,s,ans;
pi a[100010];
priority_queue<pi> q;

int main()
{
    
    
	freopen("plan.in","r",stdin);
	freopen("plan.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
    
    
		long long x,y;
		scanf("%lld%lld",&x,&y);
		a[i]=make_pair(x,y);
	}
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++)
	{
    
    
		now+=a[i].first-a[i-1].first;
		q.push(make_pair(a[i].second,a[i].first));
		s++;
		now+=a[i].second;
		while(now>m&&q.size())
		{
    
    
			s--;
			now-=q.top().first;
			q.pop();
		}
		if(now>m)
			break;
		ans=max(ans,s);
	}
	cout<<ans<<endl;
}

比赛是敲了个暴力,下来后发现这真的不是个东西。至于后面…

猜你喜欢

转载自blog.csdn.net/SSL_guyixin/article/details/109125540
SSL
今日推荐