Educational Codeforces Round 84

Educational Codeforces Round 84 (Div. 2) (1327)

感想

完美错过的一场,记错时间了。。。不过感觉题目质量蛮高。

A. Sum of Odd Integers

Description

求问 是否能表示为 个不同的正奇数之和。

Solution

个不同的正奇数之和最小值为 ,故仅当 且两数奇偶性相同时满足条件。

Code

#include
using namespace std;
typedef long long ll;
int main()
{
    int t; cin>>t;
    while(t--)
    {
        ll n,k; cin >> n>> k;
        if((n-k)%2) cout << "NO\n";
        else if(n>=k*k) cout << "YES\n"; else cout << "NO\n";
    }
}

, 需要开long long。WA了一发才发现。


B. Princesses and Princes

Description

有 个女儿和 个王子,每个女儿有可匹配的王子的列表 (单增)。从 号女儿开始,将每个女儿匹配给她的列表里尚未匹配的最小号的王子。

问是否能向一位女儿的列表里增加一位王子使得总共匹配成功的对数增加。

Solution

想错了555

本来的想法:把第一个没匹配上的女儿和(匹配到这个女儿时还剩的)最小号的王子匹配上。

WA test 2 查不出来..... 后来抄的同学的....

WA样例:

1
4
1 2
1 4
0
2 1 2

WA输出

IMPROVE
3 1

AC输出

IMPROVE
3 3

正解:把一个没匹配上的女儿和(全都匹配之后剩下的)最小号的王子匹配上。

当时可能脑抽图省事吧....

Code

#include
using namespace std;
typedef long long ll;
const int maxk = 1e6+100;
int d[maxk], p[maxk];
int main()
{
    int t; cin >> t;
    while(t--)
    {
        int n, rest=0; cin >> n;
        for(int i=1;i<=n;i++) d[i]=p[i]=0;
        for(int i=1;i<=n;i++)
        {
            int k;cin >> k;
            for(int j=1;j<=k;j++)
            {
                int g; cin >> g; 
                if(d[i]==0 && p[g]==0) d[i] = p[g] = 1;
            }
            if(!d[i] && !rest) rest = i;
        }
        if(rest)
        {
            for(int i=1;i<=n;i++)
            {
                if(!p[i]) 
                {
                    printf("IMPROVE\n%d %d\n",rest, i);
                    break;
                }
            }
        }
        else printf("OPTIMAL\n");
    }
}

C. Game with Chips

Description

的棋盘上有 个棋子,每个棋子坐标 ,目的地 。

对于路线上的每一步L/R/U/D,使所有棋子向该方向移动一格,如果已经到达边界则不动。

找到一条长度不超过 路线使得所有棋子都经过其目的地。

如果不存在,输出 。......

Solution

正解:注意到 这个限制太小了,直接全挪到一个角落然后扫一遍棋盘就完事了。

Code

#include
using namespace std;
int main()
{
    int n,m,k; cin >> n >> m >> k;
cout << m-1+n-1+n*m-1 << "\n";
for(int i=1;i<=m-1;i++) cout << "L";
for(int i=1;i<=n-1;i++) cout << "U";
for(int i=1;i<=n;i++)
{
    if(i>1) cout << "D";
    for(int j=1;j<=m-1;j++) cout <<((i%2)?"R":"L");
}

}

注意cout三目运算符外层需要再加个括号。

你可能感兴趣的:(心得)