Codeforces Round #620 (Div. 2)
A - Two Rabbits
水题,直接列方程判断(y-x)是否能整除(a+b)即可
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
//freopen("abc.in", "r", stdin);
long long int T, a, b, x, y;
scanf("%lld", &T);
while (T--)
{
scanf("%lld%lld%lld%lld", &x, &y, &a, &b);
if ((y - x) % (b + a) == 0)
printf("%lld", (y - x) / (b + a));
else
printf("-1");
if (T)
printf("\n");
}
return 0;
}
B - Longest Palindrome
每次去查看是否有可配对的字符串,另外再去寻找自成回文串的字符串(可以放在中间)
#include<bits/stdc++.h>
using namespace std;
char str[105][55];
bool vis[105];
map<int, int> ma;
int n, m, ji = -1;
bool check(char s[])
{
for (int i = 0; i < m / 2; ++i)
{
if (s[i] != s[m - 1 - i])
return false;
}
return true;
}
bool check2(char s1[], char s2[])
{
for (int i = 0; i < m; ++i)
if (s1[i] != s2[m - 1 - i])
return false;
return true;
}
int main(void)
{
//freopen("abc.in", "r", stdin);
int cnt;
scanf("%d%d", &n, &m);
for (int i = 0; i < n; ++i)
{
scanf("%s", &str[i]);
for (int j = 0; j < i; ++j)
if (check2(str[i], str[j]))
{
ma[i] = j;
vis[i] = vis[j] = 1;
break;
}
}
for (int i = 0; i < n; ++i)
if (!vis[i] && check(str[i]))
{
ji = i;
break;
}
cnt = ma.size() * 2 + (ji == -1 ? 0 : 1);
printf("%d\n", cnt * m);
if (cnt)
{
for (auto i = ma.begin(); i != ma.end(); ++i)
printf("%s", str[i->first]);
if (ji != -1)
printf("%s", str[ji]);
for (auto i = ma.rbegin(); i != ma.rend(); ++i)
printf("%s", str[i->second]);
}
return 0;
}
C - Air Conditioner
high和low两个变量来表示当前时间内可以达到的温度范围,如果超出适宜温度则以适宜温度为准,如若没有交集则输出no,last用来记录上一个顾客到来的时间
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
//freopen("abc.in", "r", stdin);
long long int T, n, m, t, l, h, high, low;
scanf("%lld", &T);
bool flag;
long long int last;
while (T--)
{
flag = 1;
scanf("%lld%lld", &n, &m);
last = 0;
high = low = m;
for (int i = 0; i < n; ++i)
{
scanf("%lld%lld%lld", &t, &l, &h);
if (flag)
{
high = high + (t - last);
low = low - (t - last);
if (high >= h)
high = h;
else
{
if (high < l)
flag = 0;
}
if (low <= l)
low = l;
else
{
if (low > h)
flag = 0;
}
last = t;
}
}
if (flag)
printf("YES");
else
printf("NO");
if (T)
printf("\n");
}
return 0;
}
D - Shortest and Longest LIS(非原创)
如果需要最小的排序的话,先把所有数字按照从大到小排列(这样的话就是0了),再根据必要的小于号,将小于号范围内的数字反转,最大的排序的话,先把所有数字按照从小到大排序(这样的话就是n了),再根据必要的大于号,对大于号范围内的数字进行反转
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int t,n,p[200005];
char s[200005];
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%s",&n,s+1);
for(int i=1;i<=n;i++)p[i]=n-i+1;
for(int i=1;i<n;)
{
int j=i;
while(s[j]=='<')j++;
reverse(p+i,p+j+1);
i=j+1;
}
for(int i=1;i<=n;i++)printf("%d ",p[i]);
printf("\n");
for(int i=1;i<=n;i++)p[i]=i;
for(int i=1;i<n;)
{
int j=i;
while(s[j]=='>')j++;
reverse(p+i,p+j+1);
i=j+1;
}
for(int i=1;i<=n;i++)printf("%d ",p[i]);
printf("\n");
}
return 0;
}
–搬运 wucstdio 的D题提交