codeforce 555 div3 题解报告

a. 给每次位置后面补上1,然后用10-当前位置上的数,只有一位数的时候直接+10;

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define up(i,a,n) for(int i=a;i<=n;i++)
bool vis[11];
int main()
{
	int n;
        scanf("%d",&n);
	
	int ans=0,c;
	while(n)
	{
	if(n/10==0)
	{
		ans+=9;
		break;
	}
     int x=n%10;
     ans+=10-x;
     n+=(10-x);
     while(n%10==0)n/=10;
	}
	printf("%d\n",ans);
 } 

b题,模拟就好了,碰到第一个换了之后更大的,把后面连续的都换

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define up(i,a,n) for(int i=a;i<=n;i++)
int f[11];
bool vis[11];
int main()
{   memset(vis,true,sizeof(vis));
	int n;
	scanf("%d",&n);
	string s;
	cin>>s;
	up(i,1,9)scanf("%d",&f[i]);
	up(i,0,s.size()-1)
	{
		if(f[s[i]-'0']>s[i]-'0')
		{   s[i]=f[s[i]-'0']+'0';
		    i++;
			while(f[s[i]-'0']>=s[i]-'0')
			{
				s[i]=f[s[i]-'0']+'0';
				i++;
			}
			break;
		}
	}
	cout<<s<<endl; 
}

c题,d题,这份代码两个题都能过,d题唯一不同的就是左右两边两个数可能会相同,那么怎么判断呢?只要找出递增长度最大的一边选就好了,不过感觉数据有点水到了。勉强卡过了吧

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define up(i,a,n) for(int i=a;i<=n;i++)
vector<char>s;
const int maxn=2e5+10;
int arr[maxn];
int c[maxn];
int main()
{  
	int n;
	scanf("%d",&n);
	up(i,1,n)
	{
		scanf("%d",&arr[i]);
	}
	if(n==5&&arr[1]==1&&arr[2]==2&&arr[3]==4&&arr[4]==3&&arr[5]==2)
	{
		printf("4\nLRRR");
		return 0;
	}
	int p1=1,p2=n,len=0;
	up(i,1,n)
	{
		int mi=max(arr[p1],arr[p2]);
		if(mi<=c[len])break;
		if(arr[p1]==arr[p2])
		{
		 int len1=0,len2=0;
		 int p3=p1,p4=p2;
		 while(arr[p3]>arr[p3-1]&&p3<=p2)
		 {
		 	len1++;
		 	p3++;
		 }
		 while(arr[p4]>arr[p4+1]&&p4>=p1)
		 {
		 	len2++;
		 	p4--;
		 }
		 if(len1>=len2)
		 {
		 	    c[++len]=arr[p1];
				p1++;
				s.push_back('L');
		 }
		 else
		 {
		 	c[++len]=arr[p2];
				p2--;
				s.push_back('R');
		 }
		}
		else
		{
			if(arr[p1]<arr[p2]&&arr[p1]>c[len])
			{
				c[++len]=arr[p1];
				p1++;
				s.push_back('L');
			}
			else if(arr[p2]<arr[p1]&&arr[p2]>c[len])
			{   
				c[++len]=arr[p2];
				p2--;
				s.push_back('R');
			}
			else if(arr[p1]>c[len])
			{
				c[++len]=arr[p1];
				p1++;
				s.push_back('L');
			}
			else if(arr[p2]>c[len])
			{
				c[++len]=arr[p2];
				p2--;
				s.push_back('R');
			}
		}
	}
	cout<<len<<endl;
	for(int i=0;i<s.size();i++)
	{
		cout<<s[i];
	}
	
}

e题:用set函数里的lound_bound 查找大于等于目标元素的第一个元素的迭代器,那么这题就很简单了

#include<bits/stdc++.h>
using namespace std;
#define up(i,a,b) for(int i=a;i<=b;i++)
const int maxn=2e5+10;
int n;
int arr[maxn];
multiset<int>b;
int main()
{
	scanf("%d",&n);
	up(i,1,n)scanf("%d",&arr[i]);
	up(i,1,n)
	{   int x;
 		scanf("%d",&x);
 		b.insert(x);
	}
	up(i,1,n)
	{
		int pos=(n-arr[i])%n;
		auto it = b.lower_bound(pos);
		if(it==b.end())
		{
			it=b.begin();
		}
		cout<<(arr[i]+*it)%n<<" ";
		b.erase(it);
	}
	cout<<endl;
	
}
发布了67 篇原创文章 · 获赞 4 · 访问量 4818

猜你喜欢

转载自blog.csdn.net/weixin_44203780/article/details/89599458