• Codeforces Round #224 (Div. 2) 解题报告


    Problem A Ksenia and Pan Scales

    题意:给你若干字母是你可以分配的, 在给你一个已经放好一些字母的天平。每个字母的重量为一,问你能不能用这些可分配的字母是天平平衡。若有解输出解决方案的任意一种。

    思路:直接暴力,先统计左右各有多少,在看一下一共有的字母总数,奇数是不可能平衡的,偶数的话再看左右两边绝对值之差,若大于可分配的字母也是不行的。剩下来把总字母数除二一边输出一半就行了。

    代码如下:

     1 //2014-01-17-23.27
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cstdlib>
     5 #include <cmath>
     6 #include <cstring>
     7 #include <algorithm>
     8 #include <queue>
     9 #include <stack>
    10 #include <vector>
    11 #define MP(a, b) make_pair(a, b)
    12 #define PB(a) push_back(a)
    13 
    14 using namespace std;
    15 
    16 typedef long long ll;
    17 typedef pair<int ,int> pii;
    18 typedef pair<unsigned int, unsigned int> puu;
    19 typedef pair<int ,double> pid;
    20 typedef pair<ll, int> pli;
    21 
    22 const int INF = 0x3f3f3f3f;
    23 const double eps = 1e-6;
    24 const int LEN = 10100;
    25 
    26 int main()
    27 {
    28 //    freopen("in.txt", "r", stdin);
    29 
    30     char str[LEN], buff[LEN];
    31     int l, r, f, pos;
    32     while(scanf("%s", str)!=EOF){
    33         int len = strlen(str);
    34         l = r = f = 0;
    35         for(int i=0; i<len; i++){
    36             if(str[i]=='|'){ f = 1;pos = i;continue;}
    37             if(f==0)l++;
    38             if(f==1)r++;
    39         }
    40         scanf("%s", buff);
    41         int ll = strlen(buff);
    42         if(abs(l-r)>ll || (l+r+ll)%2==1)printf("Impossible
    ");
    43         else{
    44             int num = (l+r+ll)/2;
    45             for(int i=0; i<pos; i++)putchar(str[i]);
    46             if(l==num)putchar('|');
    47             for(int i=0; i<ll; i++){
    48                 putchar(buff[i]);
    49                 if(i==(num-l-1))putchar('|');
    50             }
    51             for(int i=pos+1; i<len; i++)putchar(str[i]);
    52             putchar('
    ');
    53         }
    54     }
    55     return 0;
    56 }
    View Code

    Problem C Arithmetic Progression

    题意:有一排卡片卡片上有数字 ,你只能往任意位置插入一张卡片,问你有多少种情况能满足a2 - a1 = a3 - a2 = a4 - a3 = ... = ai + 1 - ai = ... = an - an - 1.

    思路:这道题我用了纯if-else流分好多情况讨论(dip为差值):

     n<=1 无数种

     n=2 差值为非零偶数 三种 num[0]-dip, (num[1]+num[0])/2, num[1]+dip

        差值为奇数 两种 num[0]-dip, num[1]+dip

        差值为零 一种 num[0]

    n>=3 先排序然后看差值有几种大于2 直接输出0

                  等于2 判断不合法的差值是不是合法的两倍 是 有一种(num[i+1]+num[i])/2

                                      不是 不可能

                  等于1 dip不为0 两种 num[0]-dip, num[n-1]+dip

                       否则 一种 num[0]

    代码如下:

     1 //2014-01-17-23.27
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cstdlib>
     5 #include <cmath>
     6 #include <cstring>
     7 #include <algorithm>
     8 #include <queue>
     9 #include <stack>
    10 #include <vector>
    11 #define MP(a, b) make_pair(a, b)
    12 #define PB(a) push_back(a)
    13 
    14 using namespace std;
    15 
    16 typedef long long ll;
    17 typedef pair<int ,int> pii;
    18 typedef pair<unsigned int, unsigned int> puu;
    19 typedef pair<int ,double> pid;
    20 typedef pair<ll, int> pli;
    21 
    22 const int INF = 0x3f3f3f3f;
    23 const double eps = 1e-6;
    24 const int LEN = 101000;
    25 
    26 int main()
    27 {
    28 //    freopen("in.txt", "r", stdin);
    29 
    30     int n, num[LEN], nnum[LEN];
    31     while(scanf("%d", &n)!=EOF){
    32         for(int i=0; i<n; i++)scanf("%d", &num[i]);
    33         sort(num, num+n);
    34         if(n<=1)printf("-1
    ");
    35         else if(n==2){
    36             int dip = (num[1]-num[0]);
    37             if(dip%2==0 && dip){
    38                 printf("3
    %d %d %d
    ", num[0]-dip, (num[1]+num[0])/2, num[1]+dip);
    39             }else{
    40                 if(dip!=0)printf("2
    %d %d
    ", num[0]-dip, num[1]+dip);
    41                 else printf("1
    %d
    ", num[0]);
    42             }
    43         }
    44         else{
    45             int el = 0, ta = -1, tb = -1;
    46             for(int i=0; i<n-1; i++) nnum[i] = num[i+1]-num[i];
    47             sort(nnum, nnum+n-1);
    48 //            for(int i=0; i<n-1; i++)cout << nnum[i] << ' '; cout << endl;
    49             for(int i=0; i<n-1; i++) {
    50                 if(ta==-1)ta = nnum[i];
    51                 if(ta!=-1 && nnum[i]!=ta)tb = nnum[i];
    52                 if(nnum[i+1]>nnum[i]){
    53                     if(!el)el = i+1;
    54                     else el = -1;
    55                 }
    56             }
    57             if(el==-1 || min(abs(el-0), abs(el-n+1))>1)printf("0
    ");
    58             else if(el == 0){
    59                 int dip = num[1]-num[0];
    60                 if(dip)printf("2
    %d %d
    ", num[0]-dip, num[n-1]+dip);
    61                 else printf("1
    %d
    ", num[0]);
    62             }else{
    63                 if(abs(el-n+1)==1)swap(ta,tb);
    64                 if(ta!=2*tb) printf("0
    ");
    65                 else{
    66                     printf("1
    ");
    67                     for(int i=0; i<n-1; i++){
    68                         if(num[i+1]-num[i]==ta){
    69                             printf("%d
    ", (num[i+1]+num[i])/2);
    70                             break;
    71                         }
    72                     }
    73                 }
    74             }
    75         }
    76     }
    77     return 0;
    78 }
    View Code
    奔跑吧!少年!趁着你还年轻
  • 相关阅读:
    50个C/C++经典面试题
    多继承的构造顺序
    sizeof(struct)
    c++ 实现strcpy(),strlen()
    十天冲刺-01
    学习进度条(第八周)
    梦断代码阅读笔记01
    学习进度条(第七周)
    团队作业记账本开发NABCD
    学习进度条(第六周)
  • 原文地址:https://www.cnblogs.com/shu-xiaohao/p/3524898.html
Copyright © 2020-2023  润新知