ECJTUACM16 Winter vacation training #4 题解&源码

时间:2024-07-26 18:35:02

https://vjudge.net/contest/149692#overview 这周一VJ比赛,题解&源码已完成!

A.........................................................................................

题目链接→Codeforces Problem 712A Memory and Crow

【题意】
有n个数b1, b2, ..., bn

a1, a2, ..., an是通过等式ai = bi - bi + 1 + bi + 2 - bi + 3....(±)bn得到的

现给你a1, a2, ..., an这n个数,问b1, b2, ..., bn是多少

详解请参看我的随笔!下面给出AC代码:

 #include <bits/stdc++.h>
using namespace std;
int main()
{
int n,a,b;
while(cin>>n)
{
for(int i=;i<=n;i++)
{
cin>>a;
if(i>)
cout<<a+b<<" ";
b=a;
}
cout<<a<<endl;
}
return ;
}

B.........................................................................................

题目链接→Codeforces Problem 708A Letters Cyclic Shift

【题意】
从仅有小写字母组成的字符串s中挑选出一个非空子串

将该子串中的每个字母均替换成前一个字母,如'b'换成'a','c'换成'b',以此类推,特别的,'a'要换成'z'

问经过一次转换之后,字典序最小的字符串s为多少

详解请参看我的随笔!下面给出AC代码:

 #include <bits/stdc++.h>
using namespace std;
int main()
{
int i,k=;
char s[];
gets(s);
int len=strlen(s);
for(i=;s[i]!='\0';i++)
if(s[i]!='a')
break;
for(;s[i]!='\0';i++)
{
if(s[i]=='a')
break;
s[i]--;
k++;
}
if(!k)
s[strlen(s)-]='z';
puts(s);
return ;
}

C.........................................................................................

题目链接→Codeforces Problem 712B Memory and Trident

【题意】
Memory从二维坐标系的原点出发,按字符串s的指示运动

R:向右;L:向左;U:向上;D:向下

Memory最终想回到原点,问至少需要改变字符串s中的几个字符

若无论如何改变都无法回到原点,输出"-1"

详解请参看我的随笔!下面给出AC代码:

 #include <bits/stdc++.h>
using namespace std;
int main()
{
char s[];
int len;
int a=,b=,c=,d=;
while(gets(s))
{
len=strlen(s);
if(len%==)
{
printf("-1\n");
}
else
{
for(int i=;s[i]!='\0';i++)
{
if(s[i]=='U')
a++;
else if(s[i]=='D')
b++;
else if(s[i]=='L')
c++;
else if(s[i]=='R')
d++;
}
printf("%d\n",(abs(a-b)+abs(c-d))/);
a=b=c=d=;
}
}
return ;
}

D.........................................................................................

题目链接→Codeforces Problem 712C Memory and De-Evolution

【题意】
现有边长为x的等边三角形,Memory想要将其变成边长为y的等边三角形

现规定Memory每秒能够改变一条边的大小,但要保证改变后的三条边仍能构成一个三角形

问,最少需要多少时间才能变为边长为y的等边三角形

详解请参看我的随笔!下面给出AC代码:

 #include <bits/stdc++.h>
using namespace std;
int main()
{
int s[];
int x,y,i;
while(cin>>x>>y)
{
int ans=;
s[]=s[]=s[]=y;
for(i=;s[]<x||s[]<x||s[]<x;i++)
{
s[]=s[]+s[]-;
sort(s,s+);
ans++;
}
cout<<ans<<endl;
}
return ;
}

E.........................................................................................

题目链接→http://poj.org/problem?id=2352

题意:

就是求每个小星星左小角的星星的个数。坐标按照Y升序,Y相同X升序的顺序给出
由于y轴已经排好序,可以按照x坐标建立一维树状数组

详解请参看我的随笔!下面给出AC代码:

 #include <stdio.h>
#include <string.h>
const int MAXN=;
const int MINN=;
int tree[MAXN];//下标为横坐标
int level[MINN];//下标为等级数
/*int lowerbit(int x)
{
return x&-x;
}*/
void add(int k,int num)
{
while(k<=MAXN)
{
tree[k]+=num;
k+=k&-k;
}
}
int read(int k)//1~k的区间和
{
int sum=;
while(k)
{
sum+=tree[k];
k-=k&-k;
}
return sum;
}
int main()
{
int n,x,y,i;
memset(tree,,sizeof(tree));
memset(level,,sizeof(level));
while(scanf("%d",&n)!=EOF)
{
for(i=;i<=n;i++)
{
scanf("%d%d",&x,&y);
int temp=read(x+);//加入x+1,是为了避免0,X是可能为0的
level[temp]++;
add(x+,);
}
for(i=;i<n;i++)
printf("%d\n",level[i]);
}
return ;
}