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

 

转载于:https://www.cnblogs.com/shu-xiaohao/p/3524898.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值