2022/9/14(cf·div3#820)https://codeforces.com/contest/1729

https://codeforces.com/contest/1729/problem/A
//暴力算,稍微注意一下b和c的位置关系

#include<bits/stdc++.h>
using namespace std;
#define int long long
//int b[200005];

signed main()
{
	int tt;
	cin>>tt;
	while(tt--)
	{
		int a,b,c;
		cin>>a>>b>>c;
		int x=a-1;
		int y;
		if(c>b)y=abs(c-b)+c-1;
		else y=b-1;
		if(x>y)puts("2");
		else if(x==y)puts("3");
		else puts("1");
	}
}

https://codeforces.com/contest/1729/problem/B
//从最后一位开始,遇0则需要往前统计两位,否则直接记录,用栈储存。
//输出可以处理得灵活些,输出st.top()+‘a’-1;

#include<bits/stdc++.h>
using namespace std;
#define int long long
//int b[200005];

signed main()
{
	int tt;
	cin>>tt;
	//char ch[27]={'0','a','b','c','d','e',};
	while(tt--)
	{
		int n;
		string s;
		cin>>n>>s;
		stack<int>st;
		for(int i=s.size()-1;i>=0;i--)
		{
			if(s[i]=='0')
			{
				int j=1,res=0;
				while(j<=10)
				{
					res+=(s[--i]-'0')*j;
					j*=10;
				}
				st.push(res);
			}
			else st.push(s[i]-'0');
		}
		while(st.empty()==0)
		{
			char ch=st.top()+'a'-1;
			st.pop();
			cout<<ch;
		}
		puts("");
	}
}

https://codeforces.com/contest/1729/problem/C
//有两个需要注意的点:
//第一,要满足第一个条件花费最少,那肯定是从第一个字母走到最后个字母,所以,会经过这两个之间得字母,且走过了就不能回头。
//第二,注意第一个字母和最后一个字母得大小问题。要么排两次序,要么向我这样排一次序,输出的时候注意一下,1是第一个输出,最后一个输出的数字与长度大小等大。
//还没学毛爷的做法,他的不用排序

#include<bits/stdc++.h>
using namespace std;
#define int long long
struct node
{
	char ch;
	int id;
}t[200005];

bool cmp(node z1,node z2)
{
	if(z1.ch==z2.ch)
		return z1.id<z2.id;
	return z1.ch<z2.ch;
}
signed main()
{
	int tt;
	cin>>tt;
	while(tt--)
	{	
		string s;
		int p=0;
		cin>>s;
		char x=s[0],y=s[s.size()-1];
		if(x>y)swap(x,y),p=1;
		
		int ans=0,j=0;
		for(int i=0;i<s.size();i++)
		{
			if(s[i]>=x&&s[i]<=y)
			{
				ans++;
				t[j].ch=s[i];
				t[j++].id=i+1;
			}
		}
		sort(t,t+j,cmp);
		cout<<y-x<<" "<<ans<<'\n';
		if(p==0)
			for(int i=0;i<j;i++)
				cout<<t[i].id<<" ";
		else 
		{
			cout<<1<<" ";
			for(int i=j-1;i>=0;i--)
			{
				if(t[i].id==1)cout<<"";
				else if(t[i].id==s.size())cout<<"";
				else cout<<t[i].id<<" ";
			}
			cout<<s.size();
		}
		puts("");
	}
}

https://codeforces.com/contest/1729/problem/D
//害,这个题没写出来,属实是自己多管闲事了
//2个人是一组,3个人也是一组,找能凑出两个人的组就行,还管其他的人干啥

#include<bits/stdc++.h>
using namespace std;
#define int long long
int b[200005];
struct node
{
	int a,c;
}t[200005];

signed main()
{
	int tt;
	cin>>tt;
	while(tt--)
	{
		int n;
		cin>>n;
		for(int i=0;i<n;i++)
			cin>>t[i].a;
		for(int i=0;i<n;i++)
		{
			cin>>t[i].c;
			b[i]=t[i].c-t[i].a;
		}
		sort(b,b+n,greater<int>());//注意大的在前,要不然,麻烦,最小的可能找不到可以和他一起填平的数(他不能去吃饭)
		int cnt=0;
		int j=n-1;
		for(int i=0;i<n;i++)
		{
			while(i<j&&(b[i]+b[j])<0)j--;//找到预算够能一起吃饭的人
			if(i<j)
				cnt++,j--;
			else break;
		}
		cout<<cnt<<'\n';
	}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值