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\n");
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('\n');
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\n");
35         else if(n==2){
36             int dip = (num[1]-num[0]);
37             if(dip%2==0 && dip){
38                 printf("3\n%d %d %d\n", num[0]-dip, (num[1]+num[0])/2, num[1]+dip);
39             }else{
40                 if(dip!=0)printf("2\n%d %d\n", num[0]-dip, num[1]+dip);
41                 else printf("1\n%d\n", 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\n");
58             else if(el == 0){
59                 int dip = num[1]-num[0];
60                 if(dip)printf("2\n%d %d\n", num[0]-dip, num[n-1]+dip);
61                 else printf("1\n%d\n", num[0]);
62             }else{
63                 if(abs(el-n+1)==1)swap(ta,tb);
64                 if(ta!=2*tb) printf("0\n");
65                 else{
66                     printf("1\n");
67                     for(int i=0; i<n-1; i++){
68                         if(num[i+1]-num[i]==ta){
69                             printf("%d\n", (num[i+1]+num[i])/2);
70                             break;
71                         }
72                     }
73                 }
74             }
75         }
76     }
77     return 0;
78 }
View Code

 

posted @ 2014-01-18 10:56  张小豪  阅读(213)  评论(0编辑  收藏  举报