~MAY~

一时间不知道要干啥了,随便写点题目吧

亚运奖牌榜

很简单的模拟,题目看错了整了半天。。

#include<bits/stdc++.h>
using namespace std;
int n;
struct a
{
	int pai[4];
}c1,c2;
int main()
{
	cin>>n;
	memset(c1.pai,0,sizeof(c1.pai));
	memset(c2.pai,0,sizeof(c2.pai));
	for(int i=1;i<=n;i++)
	{
		int nm,k;
		cin>>nm>>k;
		if(nm==0)
		c1.pai[k]++;
		if(nm==1)
		c2.pai[k]++;
	}
	cout<<c1.pai[1]<<" "<<c1.pai[2]<<" "<<c1.pai[3]<<endl;
	cout<<c2.pai[1]<<" "<<c2.pai[2]<<" "<<c2.pai[3]<<endl;
	if((c1.pai[1]>c2.pai[1])||(c1.pai[1]==c2.pai[1]&&c1.pai[2]>c2.pai[2])||(c1.pai[1]==c2.pai[1]&&c1.pai[2]==c2.pai[2]&&c1.pai[3]>c2.pai[3]))
	{
		cout<<"The first win!";
		return 0;
	}
	else if((c1.pai[1]<c2.pai[1])||(c1.pai[1]==c2.pai[1]&&c1.pai[2]<c2.pai[2])||(c1.pai[1]==c2.pai[1]&&c1.pai[2]==c2.pai[2]&&c1.pai[3]<c2.pai[3]))
	{
		cout<<"The second win!";
		return 0;
	}
}

出院

一道字符串的模拟,还是要看题!!

#include<bits/stdc++.h>
using namespace std;
const int N=105;
int n,m;
struct sss
{
	string ss;
	char a;
}s[N];
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	cin>>s[i].ss>>s[i].a;
	for(int i=1;i<=m;i++)
	{
		string sp;
		cin>>sp;
		string sf="",ssf="";
		int f=0,cnt=0;
		for(int j=1;j<=n;j++)
		{
			if(s[j].ss==sp)
			{
				f=2;
				cout<<s[j].a<<endl;
				break;
			}
		}
		if(f==2)
		continue;
		for(int j=0;j<sp.length();j++)
		{
			sf+=sp[j];
			for(int k=1;k<=n;k++)
			if(sf==s[k].ss)
			{
				ssf+=s[k].a;
				f=1;
				cnt++;
				sf="";
			}
		}
		if(f==1&&cnt<=2)
		cout<<ssf<<endl;
		else
		cout<<"D"<<endl;
	}
}

相对论大师

 这题思路很好想,用map存路径,然后一直bfs找路径,有更短的就给换了~~

主要是一开始的存入路径,我觉得这个比较重要,如下:

for(int i=1;i<=n;i++)
{
	int a,b;
	cin>>s1>>a1>>s2>>a2;
	if(!mp.count(s1))
	{
		mp[s1]=idx;
		name[idx]=s1;
		name[idx+1]=s1;
		idx+=2;
	}
	if(!mp.count(s2))
	{
		mp[s2]=idx;
		name[idx]=s2;
		name[idx+1]=s2;
		idx+=2;
	}
	if(a1==0) a=mp[s1];
	else if(a1==1) a=mp[s1]+1;
	if(a2==0) b=mp[s2];
	else if(a2==1) b=mp[s2]+1;
	add(a,b);
}

我用的是链式前向星存图,也可以用邻接表

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=2e3+5;
string s1,s2;
int a1,a2;
string name[N];
int idx;
map<string,int> mp;
int pre[N<<2];
int n;
int cnt;
int head[N<<2];
struct e
{
	int to,from;
}edge[N<<2];
void add(int a,int b)
{
	cnt++;
	edge[cnt].to=b;
	edge[cnt].from=head[a];
	head[a]=cnt;
}
vector<int> bfs(int sta,int tar)
{
	queue<int> q;
	q.push(sta);
	memset(pre,0,sizeof(pre));
	while(!q.empty())
	{
		int k=q.front();
		q.pop();
		if(k==tar)
		break;
		for(int i=head[k];i;i=edge[i].from)
		{
			int v=edge[i].to;
			if(!pre[v])
			{
				q.push(v);
				pre[v]=k;
			}
		}
	}
	vector<int> r;
	do
	{
		r.push_back(tar);
		tar=pre[tar];
	}while(tar!=0);
	return r; 
}
int main()
{
	cin>>n;
	idx=1;
	for(int i=1;i<=n;i++)
	{
		int a,b;
		cin>>s1>>a1>>s2>>a2;
		if(!mp.count(s1))
		{
			mp[s1]=idx;
			name[idx]=s1;
			name[idx+1]=s1;
			idx+=2;
		}
		if(!mp.count(s2))
		{
			mp[s2]=idx;
			name[idx]=s2;
			name[idx+1]=s2;
			idx+=2;
		}
		if(a1==0)
		a=mp[s1];
		else if(a1==1)
		a=mp[s1]+1;
		if(a2==0)
		b=mp[s2];
		else if(a2==1)
		b=mp[s2]+1;
		add(a,b);
//		cout<<s1<<" "<<a1<<" "<<mp[s1]<<" "<<name[mp[s1]]<<" "<<endl;
//		cout<<s2<<" "<<a2<<" "<<mp[s2]<<" "<<name[mp[s2]]<<" "<<endl;
	}
	vector<int> t=bfs(1,2);
	vector<int> res(N,0);
	for(int i=1;i<=idx;i+=2)
	{
		vector<int> t1=bfs(i,i+1);
		vector<int> t2=bfs(i+1,i);
		if(res.size()>t1.size()&&t1.size()>1)
		res=t1;
		if(res.size()>t2.size()&&t2.size()>1)
		res=t2;
	}
//	cout<<res.size();
//	return 0;
//	for(int i=0;i<=idx+2;i++)
//	{
//		cout<<name[i]<<" ";
//	}
//	return 0;
	for(int i=res.size()-1;i>=1;i--)
	{
		cout<<name[res[i]]<<" "<<res[i]-mp[name[res[i]]]<<" ";
		cout<<name[res[i-1]]<<" "<<res[i-1]-mp[name[res[i-1]]]<<" ";
	}
	cout<<"=";
	cout<<name[res[res.size()-1]]<<" "<<res[res.size()-1]-mp[name[res[res.size()-1]]]<<" ";
	cout<<name[res[0]]<<" "<<res[0]-mp[name[res[0]]]<<endl;
 } 

相对成功

这题是一个稍微复杂的最长不上升子序列,先对原始数据排一下,然后dp(找出以0,1为结束的最长的不上升子序列)

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int t;
int n;
int a,b;
int maxx;
int s[N];
int main()
{
	cin>>t;
	for(int i=1;i<=t;i++)
	{
		cin>>n;
		maxx=0; 
		for(int j=1;j<=n;j++)
		{
			cin>>a>>b;
			s[j]=a+1-b;
		}
		int dp[3];
		memset(dp,0,sizeof(dp));
		for(int j=1;j<=n;j++)
		{
			int x;
			cin>>x;
			for(int k=s[x];k<3;k++)
			dp[s[x]]=max(dp[s[x]],dp[k]+1);
			maxx=max(dp[s[x]],maxx);
		}
		cout<<n-maxx<<endl;
	}
}

Codeforces Round 944 (div. 4)--补题

D-Binary Cut

其实就是一个判断前后字符的问题,最后都是要将0和1排成0....1...序列(或者是0...或1...)。能发现,中间一段序列不论是01还是10,都需要切一次,使0和1分开,其他的不管(同样如此)。

如果第一个数是0,那么第一个字符就不用切开,并且最后可以省去1次,故ans-1;

如果ans>2,意味着需要切,因为最开始给ans定义为1,因此ans-1;

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=505;
int n;
string s;
int ans=1;
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>s;
		ans=1;
		for(int j=1;j<s.length();j++)
		if(s[j]!=s[j-1])
		ans++;
		if(ans==1)
		{
			cout<<1<<endl;
			continue;
		}
		if(s[0]=='0'||ans>2)
		cout<<ans-1<<endl;
		else
		cout<<ans<<endl;
	}
}

E-Find the Car

我开始是用double算了每个时间段的速度,然后四舍五入总是出问题,处理起来还很麻烦,这会儿补题,直接用整数进行乘除就行了,就是将还需要走的路程*这一段的路程/这一段的时间(也就是路程/速度=时间)(lower_bound和upper_bound代替二分应该也可)

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+5;
ll t;
ll n,k,q;
ll a[N],b[N];
ll d;
double v[N];
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>n>>k>>q;
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		for(int i=1;i<=k;i++)
		cin>>a[i];//点位 
		for(int i=1;i<=k;i++)
		cin>>b[i];//时间
		for(int i=1;i<=q;i++)
		{
			cin>>d;
			if(d==0)
			{
				cout<<0<<endl;
				continue;
			}
			int l=0,r=k,mid=(l+r)>>1;//找点位 
			while(l<r)
			{
				mid=(l+r)>>1;
				if(a[mid]<d)
				l=mid+1;
				else
				r=mid;
			}
			int x=d-a[l-1];
			ll ans=x*(b[l]-b[l-1])/(a[l]-a[l-1]);
			cout<<b[l-1]+ans<<endl;
		}
	}
}

还在牛客上打了山东理工的一场比赛,感觉有点水,就不放进来了。。

......

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值