a. 给每次位置后面补上1,然后用10-当前位置上的数,只有一位数的时候直接+10;
#include
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
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<
c题,d题,这份代码两个题都能过,d题唯一不同的就是左右两边两个数可能会相同,那么怎么判断呢?只要找出递增长度最大的一边选就好了,不过感觉数据有点水到了。勉强卡过了吧
#include
using namespace std;
#define ll long long
#define up(i,a,n) for(int i=a;i<=n;i++)
vectors;
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]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');
}
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<
e题:用set函数里的lound_bound 查找大于等于目标元素的第一个元素的迭代器,那么这题就很简单了
#include
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];
multisetb;
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<