codeforces round #499(div2) 做题记录

A. Stages

题意:

给你n个字母,你要选k个,你选择的相邻两个字母在字母表中必须满足中间至少隔一个字母,每个字母的权值是c-‘a’+1,求最小权值和。

k<=n<=50

题解:贪心,从前向后扫,满足题意的就加进去就可以了

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 #define maxn 55
 4 using namespace std;
 5 int n,k;
 6 char s[maxn];
 7 int w[maxn];
 8 int main()
 9 {
10     scanf("%d%d",&n,&k);
11     scanf("%s",s+1);
12     for(int i=1;i<=n;++i)w[s[i]-‘a‘+1]++;
13     int last=-1,tot=0,ans=0;
14     for(int i=1;i<=26;++i)if(w[i]&&i-last>1)
15     {
16         tot++;ans+=i;last=i;
17         if(tot==k)break;
18     }
19     if(tot<k)puts("-1");else printf("%d\n",ans);
20     return 0;
21 }

B. Planning The Expedition

题意:

你有n个人,m个食品,每个食品有一个种类a_i,你现在要用这些食品喂饱这些人,每个人第一天吃了哪个种类的食品以后每天都必须吃这个种类的食品,求让这n个人生存的最大天数

n,m,a_i<=100

题解:

枚举天数,然后check一遍

 1 #include<bits/stdc++.h>
 2 #define maxn 105
 3 using namespace std;
 4 int n,m;
 5 int c[maxn];
 6 int main()
 7 {
 8     scanf("%d%d",&n,&m);
 9     for(int x,i=1;i<=m;++i)scanf("%d",&x),c[x]++;
10     for(int T=1;T<=1000;++T)
11     {
12         int tot=0;
13         for(int i=1;i<=100;++i)tot+=c[i]/T;
14         if(tot<n)
15         {
16             printf("%d\n",T-1);
17             return 0;
18         }
19     }
20     return 0;
21 }

C. Fly

题意:

有n个星球,你要从1->2->3->……->n->1,每次起飞降落都要消耗燃料,消耗的燃料*系数=(飞船重量m+燃料重量),给定每次的系数a_i和b_i,求最少要带多少燃料

n,m<=1000

题解:

把起降的序列搞出来,然后从最后一次剩余燃料开始解方程即可,方程无解就是-1

 1 #include<bits/stdc++.h>
 2 #define maxn 1005
 3 using namespace std;
 4 const double eps=1e-7;
 5 int n;
 6 double m;
 7 double a[maxn],b[maxn],c[maxn*2];
 8 int main()
 9 {
10     scanf("%d",&n);
11     scanf("%lf",&m);
12     for(int i=1;i<=n;++i)scanf("%lf",&a[i]);
13     for(int i=1;i<=n;++i)scanf("%lf",&b[i]);
14     for(int i=1;i<=n;++i)c[i*2-2]=b[i],c[i*2-1]=a[i];
15     c[0]=0;c[n*2]=b[1];n*=2;
16     for(int i=1;i<=n;++i)
17     {
18         if(c[i]-1<=eps)
19         {
20             puts("-1");
21             return 0;
22         }
23     }
24     double t=0;
25     for(int i=n;i;--i)
26     {
27         t=(m+c[i]*t)/(c[i]-1);
28     }
29     printf("%.10lf\n",t);
30     return 0;
31 }

D.Rocket

题意:

交互题

给你一个范围1~m,让你猜一个数x,每次系统会告诉你你猜的数y是y<x还是y=x还是y>x

但系统会说谎,具体来说,有一个长度为n的01序列,0表示说谎,1表示不说谎,系统按这个序列循环询问。

但你只知道n和m,并不知道序列,你要猜出这个数

n<=30,m<=1e9,询问次数<=60

题解:

首先我们可以询问1-n,如果猜中很好,如果没猜中那么答案肯定>i,所以这个序列就可以在n次询问被确定下来

然后二分就行了

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m;
 4 int a[35];
 5 int main()
 6 {
 7     scanf("%d%d",&m,&n);
 8     for(int i=0;i<n;++i)
 9     {
10         printf("%d\n",i+1);
11         fflush(stdout);
12         int opt;
13         scanf("%d",&opt);
14         if(opt==0)
15         {
16             return 0;
17         }
18         if(opt==1)a[i]=1;
19         if(opt==-1)a[i]=-1;
20     }
21     int l=1,r=m;
22     for(int T=0;T<30;++T)
23     {
24         int x=T%n;
25         int mid=(l+r)>>1;
26         printf("%d\n",mid);
27         fflush(stdout);
28         int opt;
29         scanf("%d",&opt);
30         if(opt==0)
31         {
32             return 0;
33         }
34         opt*=a[x];
35         if(opt==-1)r=mid-1;
36         if(opt==1)l=mid+1;
37     }
38     return 0;
39 }

E. Border

题意:

你有n个数,每个数可以用无限次,求在模k意义下你能表示出哪些数

n,k<=100000

题解:

有一个结论是能被这些数模k意义下线性表示的最小数是gcd(k,a_1,a_2,……,a_n)

然后是这个数的倍数都可以

#include<bits/stdc++.h>
#define maxn 100005
using namespace std;
int n,k;
int a[maxn];
int gcd(int a,int b)
{
    if(!b)return a;
    return gcd(b,a%b);
}
int main()
{
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;++i)
    {
        scanf("%d",&a[i]);
    }
    int t=k;
    for(int i=1;i<=n;++i)t=gcd(a[i],t);
    int tot=0;
    for(int i=1;i<=k;++i)
    {
        if(i%t==0)tot++;
    }
    printf("%d\n",tot);
    if(k%t==0)printf("0 ");
    for(int i=1;i<k;++i)
    {
        if(i%t==0)printf("%d ",i%k);
    }
    return 0;
}

F. Mars rover

题意:

不好描述,直接英文看题面吧 http://codeforces.com/contest/1011/problem/F

题解:

考虑每次改动只影响一条链,所以我们可以预处理出来每个点状态为0/1,其他不变,朝上跳会变成什么数

倍增搞一搞就行了

 1 #include<bits/stdc++.h>
 2 #define maxn 1000005
 3 using namespace std;
 4 int n;
 5 int tp[maxn],fa[maxn],son[maxn][2],val[maxn];
 6 void dfs(int u)
 7 {
 8     if(tp[u]==1)return;
 9     if(son[u][0])dfs(son[u][0]);
10     if(son[u][1])dfs(son[u][1]);
11     if(tp[u]==2)val[u]=val[son[u][0]]^1;
12     if(tp[u]==3)val[u]=val[son[u][0]]&val[son[u][1]];
13     if(tp[u]==4)val[u]=val[son[u][0]]|val[son[u][1]];
14     if(tp[u]==5)val[u]=val[son[u][0]]^val[son[u][1]];
15 }
16 int anc[maxn][22];
17 bool Ans[2][maxn][22];
18 inline int get(int u,int v,int x)
19 {
20     if(tp[u]==2)return x^1;
21     int ls=son[u][0],rs=son[u][1];
22     if(rs==v)swap(ls,rs);
23     if(tp[u]==3)return x&val[rs];
24     if(tp[u]==4)return x|val[rs];
25     if(tp[u]==5)return x^val[rs];
26 }
27 void init()
28 {
29     for(int i=2;i<=n;++i)
30     {
31         anc[i][0]=fa[i];
32         Ans[0][i][0]=get(fa[i],i,0);
33         Ans[1][i][0]=get(fa[i],i,1);
34     }
35     for(int j=1;j<=20;++j)
36     {
37         for(int i=1;i<=n;++i)
38         {
39             anc[i][j]=anc[anc[i][j-1]][j-1];
40             Ans[0][i][j]=Ans[Ans[0][i][j-1]][anc[i][j-1]][j-1];
41             Ans[1][i][j]=Ans[Ans[1][i][j-1]][anc[i][j-1]][j-1];
42         }
43     }
44 }
45 int query(int u)
46 {
47     int ans=val[u]^1;
48     for(int i=20;i>=0;--i)if(anc[u][i])
49     {
50         ans=Ans[ans][u][i];
51         u=anc[u][i];
52     }
53     return ans;
54 }
55 int main()
56 {
57     scanf("%d",&n);
58     for(int i=1;i<=n;++i)
59     {
60         char opt[5];
61         scanf("%s",opt);
62         int x,y;
63         if(opt[0]==‘I‘)
64         {
65             tp[i]=1;
66             scanf("%d",&x);
67             val[i]=x;
68         }
69         if(opt[0]==‘N‘)
70         {
71             tp[i]=2;
72             scanf("%d",&x);
73             son[i][0]=x;fa[x]=i;
74         }
75         if(opt[0]==‘A‘)
76         {
77             tp[i]=3;
78             scanf("%d%d",&x,&y);
79             son[i][0]=x;son[i][1]=y;fa[x]=fa[y]=i;
80         }
81         if(opt[0]==‘O‘)
82         {
83             tp[i]=4;
84             scanf("%d%d",&x,&y);
85             son[i][0]=x;son[i][1]=y;fa[x]=fa[y]=i;
86         }
87         if(opt[0]==‘X‘)
88         {
89             tp[i]=5;
90             scanf("%d%d",&x,&y);
91             son[i][0]=x;son[i][1]=y;fa[x]=fa[y]=i;
92         }
93     }
94     dfs(1);
95     init();
96     for(int i=1;i<=n;++i)if(tp[i]==1)printf("%d",query(i));
97     puts("");
98     return 0;
99 }

原文地址:https://www.cnblogs.com/uuzlove/p/9378922.html

时间: 2024-10-08 07:40:22

codeforces round #499(div2) 做题记录的相关文章

codeforces round#259 div2 B题(KMP)

先上链接:http://codeforces.com/contest/454/problem/B B. Little Pony and Sort by Shift time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output One day, Twilight Sparkle is interested in how to sort a se

codeforces round 418 div2 补题 CF 814 A-E

A An abandoned sentiment from past 水题 #include<bits/stdc++.h> using namespace std; int a[300],b[300],n,k; bool cmp(int a,int b) { return a>b; } int main() {//freopen("t.txt","r",stdin); scanf("%d%d",&n,&k); f

codeforces round 421 div2 补题 CF 820 A-E

A Mister B and Book Reading  O(n)暴力即可 #include<bits/stdc++.h> using namespace std; typedef long long int LL; const LL N=1,M=1,MOD=1; int main() {//freopen("t.txt","r",stdin); int c,v0,v1,a,l; scanf("%d%d%d%d%d",&c,&

Educational Codeforces Round 20解(bu)题记录

A. Maximal Binary Matrix 解法:暴力模拟+贪心 #include<bits/stdc++.h> using namespace std; int a[110][110]; int main(){ int n,k,cmp,f=0;scanf("%d%d",&n,&k); if(k>n*n){puts("-1");return 0;}cmp=n; int r=1; while(k>=2*cmp-1){ k-

codeforces round 422 div2 补题 CF 822 A-F

A I'm bored with life 水题 #include<bits/stdc++.h> using namespace std; typedef long long int LL; const LL N=1,M=1,MOD=1; int main() {//freopen("t.txt","r",stdin); ios::sync_with_stdio(false); LL a,b; scanf("%I64d%I64d",&

codeforces round #324(div2) E题 Anton and lra

这道E题真的毒瘤啊,看完题解后还花了三小时AC... 主要是让这个位置上的数字如果要换到前面,那么前面至少有一个要到这个位置上,交换就好啦. 交换之后更新位置,直到这个数字被交换到指定位置. 为了 简化操作,我们可以把所有目标序列(s列)中数字出现的位置替换p序列中的数字,这样目标序列转化成一个1到n的序列 #include<bits/stdc++.h> using namespace std; int p[2001]; int s[2001]; int pos[2001]; int tot;

codeforces round #257 div2 C、D

本来应该认真做这场的,思路都是正确的. C题,是先该横切完或竖切完,无法满足刀数要求,再考虑横切+竖切(竖切+横切), 因为横切+竖切(或竖切+横切)会对切割的东西产生交叉份数,从而最小的部分不会尽可能的大. 代码如下,虽然比较长.比较乱,但完全可以压缩到几行,因为几乎是4小块重复的代码,自己也懒得压缩 注意一点,比如要判断最小块的时候,比如9行要分成2份,最小的剩下那份不是9取模2,而应该是4 m/(k+1)<=m-m/(k+1)*k          #include<bits/stdc+

【前行】◇第3站◇ Codeforces Round #512 Div2

[第3站]Codeforces Round #512 Div2 第三题莫名卡半天……一堆细节没处理,改一个发现还有一个……然后就炸了,罚了一啪啦时间 Rating又掉了……但是没什么,比上一次好多了:) +传送门+ ◇ 简单总结 前两道题非常OK,秒掉还好.心态爆炸是从第三题开始的……一开始设计的判断方法没有考虑0,然后就错了很多次,然后改了过后又没有考虑整个数要分成2个及以上的数,继续WA,最后整个程序删了重新魔改了一次终于AC.感觉最后的AC代码的复杂度要比原来高一些,但是毕竟AC了,还是不

codeforces Round #250 (div2)

a题,就不说了吧 b题,直接从大到小排序1-limit的所有数的lowbit,再从大到小贪心组成sum就行了 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #define N 200000 6 using namespace std; 7 int pos[N],a[N],s[N],f[N],la[N],b[N],i,j,k,ans,n,p