2017.09.03校内训练

T1:卡片

题解:这很明显,是一道选择题!!!

我们考虑每一种情况:只有一种卡片时,很显然最后剩下的只能是这一种;有三种卡片时,可以变成各只有一张,无论选取哪两张,都可以变成剩下的那一张,因此每一种都可以剩下;有两种的情况:若这两种都有两张以上,便可以各取一张合成没有的那一种,最后结果请参见上一条;若有一种只有一张,另一种有多张,则每一次的转化操作都要使用到较多的那种一张,不论如何都不可能合成较多张的那一种。因此结果是除了多于一张的那一种以外的其它两种;若这两种各只有一张,则结果必定是没有的那一种。

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<cmath>
 6 #include<algorithm>
 7 using namespace std;
 8 struct node{
 9     char ki;
10     int num;
11 }card[5];
12 int n,kind=0;
13 bool c[5]={};
14 char s[210];
15 int main(){
16     freopen("card.in","r",stdin);
17     freopen("card.out","w",stdout);
18     scanf("%d",&n);
19     scanf("%s",s);
20     int i,j;
21     card[1].ki=‘B‘;card[2].ki=‘G‘;card[3].ki=‘R‘;
22     card[1].num=0;card[2].num=0;card[3].num=0;
23     int x;
24     for(i=0;i<n;++i){
25         if(s[i]==‘B‘)  x=1;
26         if(s[i]==‘G‘)  x=2;
27         if(s[i]==‘R‘)  x=3;
28         if(card[x].num==0)  kind++;
29         card[x].num++;
30     }
31     if(kind==3){
32         printf("BGR\n");
33         return 0;
34     }
35     if(kind==1){
36         if(card[1].num>0)  printf("B\n");
37         if(card[2].num>0)  printf("G\n");
38         if(card[3].num>0)  printf("R\n");
39         return 0;
40     }
41     if(kind==2){
42         int a,b;
43         if(card[1].num>0){
44             a=1;
45             if(card[2].num>0)  b=2;
46             else  b=3;
47         }
48         else{
49             a=2;b=3;
50         }
51         if(card[a].num>=2 && card[b].num>=2){
52             printf("BGR\n");
53             return 0;
54         }
55         if(card[a].num==1 && card[b].num==1){
56             for(i=1;i<=3;++i){
57                 if(card[i].num==0){
58                     printf("%c\n",card[i].ki);
59                     return 0;
60                 }
61             }
62         }
63         for(i=1;i<=3;++i){
64             if(card[i].num<=1)  c[i]=true;
65         }
66         for(i=1;i<=3;++i){
67             if(c[i]==true){
68                 printf("%c",card[i].ki);
69             }
70         }
71         printf("\n");
72     }
73     return 0;
74 }

card.cpp

T2:取数

题解:我们注意到:取奇数个数的数一定不会比再取一个偶数的结果更劣。而计算平均数的复杂度很高。因此我们考虑枚举中位数。而取一个中位数,在一个递增序列中,它左边的数应当尽量靠近它,右边的数应当尽量远离它。因此我们由题目可以得出:可以对于每一个位置三分这个位置的最优解/较优解并更新答案即可。

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cmath>
 5 #include<algorithm>
 6 #include<cstring>
 7 #define ll long long
 8 using namespace std;
 9 int n;
10 ll maxw,maxl,l,r,wa,wb;
11 int a[200010];
12 ll pre[200010];
13 double va,vb,v,ans=-1;
14 double getans(int w,int l){
15     ll sum=0;
16     sum+=pre[w]-pre[w-l-1];
17     sum+=pre[n]-pre[n-l];
18     return (double)sum/(double)(2*l+1)-(double)a[w];
19 }
20 int main(){
21     freopen("win.in","r",stdin);
22     freopen("win.out","w",stdout);
23     scanf("%d",&n);
24     int i,j,k;
25     for(i=1;i<=n;++i){
26         scanf("%d",&a[i]);
27     }
28     sort(a+1,a+n+1);
29     pre[0]=0;
30     for(i=1;i<=n;++i){
31         pre[i]=pre[i-1]+a[i];
32     }
33     if(n<=2){
34         printf("0.00\n");return 0;
35     }
36     for(i=1;i<=n;++i){
37         l=0;r=min(i-1,n-i);
38         while(l+1<=r){
39             wa=l+(r-l)/3;
40             wb=r-(r-l)/3;
41             va=getans(i,wa);
42             vb=getans(i,wb);
43             if(va>vb){
44                 r=wb-1;
45             }
46             else  l=wa+1;
47         }
48         v=getans(i,l);
49         if(v>ans){
50             ans=v;
51             maxw=i;
52             maxl=l;
53         }
54     }
55     printf("%.2lf",ans);
56     return 0;
57 }

win.cpp

T3:密码

题解:我们注意到,因为可能出现的密码种类只有10000种。所以我们先用O(10L)的时间来预处理出对于每一位向后的第一个某数字的位置。之后在O(10000)的时间内枚举密码,对于每一个密码,可以在O(n)的时间里check,最后统计进模板里即可。

代码:

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<algorithm>
 7 using namespace std;
 8 char ch[1000010];
 9 int l[1010];
10 int n,a,b;
11 int f[1000010][20];
12 int main(){
13     freopen("key.in","r",stdin);
14     freopen("key.out","w",stdout);
15     int i,w,h,z,j;
16     scanf("%d",&n);
17     l[0]=0;
18     for(i=1;i<=n;++i){
19         scanf("%d%s",&l[i],ch+l[i-1]);
20         l[i]+=l[i-1];
21     }
22     for(i=0;i<=9;++i)  f[l[n]][i]=l[n];
23     for(i=l[n]-1;i>=0;--i){
24         memcpy(f[i],f[i+1],sizeof f[i+1]);
25         f[i][ch[i]-48]=i;
26     }
27     a=0;b=0;
28     for(w=0;w<=9;++w){
29         for(h=0;h<=9;++h){
30             for(z=0;z<=9;++z){
31                 for(j=0;j<=9;++j){
32                     for(i=0;i<n;++i){
33                         if(f[f[f[f[l[i]][w]][h]][z]][j]<l[i+1])  ++a;
34                         else  break ;
35                     }
36                     b+=a/n;a=0;
37                 }
38             }
39         }
40     }
41     printf("%d\n",b);
42     return 0;
43 }

key.cpp

T4:三角之恋

题解:我们可以从题目中看出这些信息:由于我们所要加入平面中的三角形都是等腰直角三角形,因此对于每一个单位长度的正方形,若其被覆盖,则只会存在两种情况:完全覆盖与过对角线覆盖一半。因此我们考虑采用离散化+扫描线的方式做。

首先我们需要离散每个三角形的(x,y),(x+m,y),(x,y+m)三个点,便于后面计算答案。

然后我们将每个三角形记作一个只有底部线段,并且右端点不断向左端点缩小的线段。在更新时直接暴力排序并且剔除会被某个其他线段覆盖的线段,然后将y坐标不断向上推,在过程中暴力计算每个离散长方形的面积,如果某个长方形没有被完全覆盖,那么就减去没覆盖的部分的面积。这样就可以在O(n2)的时间复杂度内计算出答案。

代码:

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstdlib>
  4 #include<cstring>
  5 #include<algorithm>
  6 #include<cmath>
  7 #define ll long long
  8 using namespace std;
  9 struct node{
 10     int x,y,m,xb,tx,ty;
 11 }tri[5010];
 12 int n,lx,ly,ls,th;
 13 int x[10010],y[10010];
 14 node s[10010];
 15 bool u[10010];
 16 ll ans;
 17 bool cmp(node a,node b){
 18     if(a.y!=b.y)  return a.y<b.y;
 19     if(a.x!=b.x)  return a.x<b.x;
 20     return a.tx<b.tx;
 21 }
 22 void work(){
 23     int to=y[th+1]-y[th],r;
 24     int i,j=1;
 25     for(i=s[1].x;x[i]<=s[ls].xb;++i){
 26         while(j<ls && i>=s[j+1].x)  ++j;
 27         if(x[i]>=s[j].xb)  continue ;
 28         r=min(x[i+1],s[j].xb);
 29         ans+=2LL*(r-x[i])*to;
 30         if(r>s[j].xb-to){
 31             if(x[i]<s[j].xb-to){
 32                 int l=r-(s[j].xb-to);
 33                 ans-=(ll)l*l;
 34             }
 35             else{
 36                 ans-=(ll)(r-x[i])*(r-x[i]);
 37                 int l=x[i]-(s[j].xb-to);
 38                 ans-=2LL*l*(r-x[i]);
 39             }
 40         }
 41     }
 42     th++;
 43     for(i=1;i<=ls;++i){
 44         if(s[i].ty<=th)  u[i]=false;
 45         else{
 46             u[i]=true;
 47             s[i].xb=x[s[i].tx]-(y[th]-y[s[i].y]);
 48         }
 49     }
 50     int k=ls;ls=0;
 51     for(i=1;i<=k;++i){
 52         if(u[i])  s[++ls]=s[i];
 53     }
 54 }
 55 int main(){
 56     freopen("tri.in","r",stdin);
 57     freopen("tri.out","w",stdout);
 58     scanf("%d",&n);
 59     int i,j,k;
 60     for(i=1;i<=n;++i){
 61         scanf("%d%d%d",&tri[i].x,&tri[i].y,&tri[i].m);
 62         x[++lx]=tri[i].x;x[++lx]=tri[i].x+tri[i].m;
 63         y[++ly]=tri[i].y;y[++ly]=tri[i].y+tri[i].m;
 64     }
 65     sort(x+1,x+lx+1);sort(y+1,y+ly+1);
 66     lx=unique(x+1,x+lx+1)-x-1;
 67     ly=unique(y+1,y+ly+1)-y-1;
 68     y[ly+1]=2e9;x[lx+1]=2e9;
 69     for(i=1;i<=n;++i){
 70         tri[i].tx=lower_bound(x+1,x+lx+1,tri[i].x+tri[i].m)-x;
 71         tri[i].ty=lower_bound(y+1,y+ly+1,tri[i].y+tri[i].m)-y;
 72         tri[i].x=lower_bound(x+1,x+lx+1,tri[i].x)-x;
 73         tri[i].y=lower_bound(y+1,y+ly+1,tri[i].y)-y;
 74         tri[i].xb=x[tri[i].tx];
 75     }
 76     sort(tri+1,tri+n+1,cmp);
 77     tri[n+1].y=ly+1;
 78     ls=1;s[ls]=tri[1];th=tri[1].y;s[0].xb=-2e9;
 79     for(i=2;i<=n+1;++i){
 80         while(ls && tri[i].y>th)  work();
 81         if(th<tri[i].y)  th=tri[i].y;
 82         bool found=false;
 83         for(j=1;j<=ls;++j){
 84             if(tri[i].x<s[j].x){
 85                 if(tri[i].xb<=s[j-1].xb)  break ;
 86                 for(k=ls;k>=j;--k)  s[k+1]=s[k];
 87                 s[j]=tri[i];
 88                 int lr=ls+1;ls=j;
 89                 for(k=j+1;k<=lr;++k){
 90                     if(s[k].xb>s[j].xb)  s[++ls]=s[k];
 91                 }
 92                 found=true;
 93             }
 94         }
 95         if(!found && tri[i].xb>s[ls].xb)  s[++ls]=tri[i];
 96     }
 97     if(ans&1){
 98         printf("%lld.5",ans/2);
 99     }
100     else  printf("%lld.0",ans/2);
101     return 0;
102 }

tri.cpp

时间: 2024-08-10 17:17:27

2017.09.03校内训练的相关文章

2017.09.24校内训练

T1:个人卫生综合征 题目描述: 每天BBS都要从家里经过城市中的一段路到学校刷五三.城市中一共有n个路口和m条双向道路,每条双向道路都连接着两个路口ai.bi且有一定的时间花费vi.BBS家编号为1,学校编号为n.今天,BBS由于个人卫生综合征导致他很迟才离开家,他想用膜法改变k条道路的长度使通过其的时间花费vi变为0.现在他问你改变道路长度之后他到学校的最小时间花费是多少? 输入格式: 第一行为三个整数n.m.k,接下来的m行每行三个整数ai,bi,vi,分别表示这条路连着的两个路口和通过其

无垠PE组合工具2017.09.03 维护版网络版

适合大众--无垠PE组合工具,维修维护专用--简洁实用.功能俱全,赢得信赖! 无垠PE及工具都源于无忧启动论坛所得,无OEM或个人信息,不修改主页.不写垃圾文件.无广告.无暗扣.无陷阱!采用Win8PEx64内核.工具网络全内置,支持UEFI启动.可量产.刻盘.U+/B+.无垠PE组合工具修改版由网友"恋梦"更新维护,在原版基础适当精简后,针对里面工具进行升级,精简不常用工具,维护系统完全够用!123 新版变化 2017.09.03 更新- Acronis True Image 201

调试大叔V1.0.1(2017.09.01)|http/s接口调试、数据分析程序员辅助开发神器

2017.09.01 - 调试大叔 V1.0.1*支持http/https协议的get/post调试与反馈:*可保存请求协议的记录:*内置一批动态参数,可应用于URL.页头.参数:*可自由管理cookie:*支持请求的代理与模拟环境参数设置:*时间戳管理(取网络当前时间戳.转成日期.转成倒计时):*支持拖放文件到本程序窗计算文件的MD5.SHA1.CRC32值:*集成常见编码解码(Ansi与Utf8互转.URL加解密.UniCode转中文);*集成常用符号与其UniCode值:*集成常用数学计算

2017.6.11 校内模拟赛

题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小copy一下排个序 用两个指针维护两个数组(原数据 和 排序后的数据), 即分为1数据和2数组 将小于1指针指向的数据的2数组中的数据全部压入栈中 后进行消除, 将栈栈顶元素与当前1数组中的1指针指向的元素进行比较 相同则消除 后重复过程 直至指针超过N 后判断一下是否两个指针都超过了N... #incl

【2017.09.29 星期五 关于c++瞎侃】

c++中最重要的语法特征就是 类 了,通过它,程序员可以自定义自己的数据类型. c++中的类包含 数据成员 也 包含 函数成员. C++语言主要的一个设计目标 就是让程序员自定义的的数据类型向 内置类型一样 好用. 基于此, 标准c++库 实现了丰富的类和函数. 野心很大 [2017.09.29 星期五 关于c++瞎侃]

2017.12.03

2017.12.03 贪心 1.金银岛 思路:既然每一种金属都是可以任意切割的,那么就可以先求出每一种金属的单位价值,把它进行排序,从单位价值最大的开始装起,只要背包还有空间就全部装进背包,如果装不完就把剩下的空间全部装这种物体. for(i=1;i<=s;i++){ scanf("%lf%lf",&gold[i][1],&gold[i][2]); gold[i][3]=gold[i][2]/gold[i][1]; } for(i=1;i<s;i++){ i

「csp校内训练 2019-10-24」解题报告

「csp校内训练 2019-10-24」解题报告 T1.猴猴吃苹果 \(Description\) 猴猴最喜欢在树上玩耍,一天猴猴又跳上了一棵树,这棵树有 \(N \ (N \leq 50000)\) 个苹果,每个苹果有一个编号,分别为 \(0\) ~ \(N - 1\) 它们之间由 \(N-1\) 个树枝相连,猴猴可以从树枝的一端爬到树枝的另一端,所以猴猴可以从任意一个苹果的位置出发爬到任意猴猴想去的苹果的位置. 猴猴开始在编号为 \(K \ (K < N)\) 的苹果的位置,并且把这个苹果吃

「csp校内训练 2019-10-30」解题报告

「csp校内训练 2019-10-30」解题报告 T1.树 题目链接(逃) \(Description\): 现在有一棵树,共 \(N\) 个节点. 规定:根节点为 \(1\) 号节点,且每个节点有一个点权. 现在,有 \(M\) 个操作需要在树上完成,每次操作为下列三种之一: \(1 \ x \ a\):操作 \(1\),将节点 \(x\) 点权增加 \(a\). \(2 \ x \ a\):操作 \(2\),将以节点 \(x\) 为根的子树中所有点的权值增加 \(a\). \(3 \ x\)

20170910校内训练

CCT 最近学校又发了n本五三题霸,BBS看到后十分高兴.但是,当他把五三拿到手后才发现,他已经刷过这些书了!他又认真地看了一会儿,发现新发的这些五三是2017版的,而他刷的是2016版的.现在他想找出所有他没有刷过的题来刷.每本五三都有m道题,并且它的特征(即它和去年版本的五三的差距)可以用一个m位二进制数来代表,二进制位上的1代表该题不同,0代表该题相同.比如4(100)就代表题目3和去年的有不同.5(101)就代表题目1和题目3和去年的有不同.而BBS热衷于给自己找麻烦,他要选择连续一段的