Codeforces Round #617 (Div. 3)

A

题意:能否将数组里面的值用数组里面的值替换出一个和为奇数的数组

思路:1.和为奇数yes 2.和为偶数但有奇数yes 3.个数是奇数的,有奇数的yes 其他都是no

果然罚时全给了A

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define il inline
 5 #define it register int
 6 #define lowbit(x) (x)&(-x)
 7 #define mem(a,b) memset(a,b,sizeof(a))
 8 #define mod 1000000007
 9 const int maxn=1e5+10;
10 int a,n,sum;
11 int main(){
12     int t;
13     scanf("%d",&t);
14     while(t--){
15         scanf("%d",&n);
16         sum=0;
17         int f=0,f2=0;
18         for(it i=0;i<n;i++){
19             scanf("%d",&a);
20             sum+=a;if(a&1){f=1;}
21             if(a%2==0){f2=1;}
22         }
23         if(sum&1 || (f==1 && n&1) || (sum%2==0 &&f==1 && f2==1)){
24             printf("YES\n");
25         }
26         else{
27             printf("NO\n");
28         }
29     }
30     return 0;
31 }
View Code

 

B

题意:每花十元,可以得一元,问最多能花多少

思路:9的倍数特判(n-1)/9+n,其他 n/9+n就是答案

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define il inline
 5 #define it register int
 6 #define lowbit(x) (x)&(-x)
 7 #define mem(a,b) memset(a,b,sizeof(a))
 8 #define mod 1000000007
 9 const int maxn=1e5+10;
10 int a,n,sum;
11 int main(){
12     int t;
13     scanf("%d",&t);
14     while(t--){
15           scanf("%d",&n);
16           if(n%9==0){
17                 printf("%d\n",n+(n-1)/9);continue;
18           }
19           printf("%d\n",n+n/9);
20     }
21     return 0;
22 }
View Code

 

C

题意:如果有走过重复点,算出最小的步数的l和r值

思路:用map存点,模拟就行

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define il inline
 5 #define it register int
 6 #define lowbit(x) (x)&(-x)
 7 #define mem(a,b) memset(a,b,sizeof(a))
 8 #define mod 1000000007
 9 const int maxn=2e5+10;
10 int n,t;
11 struct node{
12     int x,y;
13     friend bool operator<(const node a,const node b){
14             if(a.x==b.x){
15                       return a.y<b.y;
16             }
17             return a.x<b.x;
18     }
19     node(){}
20     node(int xx,int yy):x(xx),y(yy){}
21 };
22 char s[maxn];
23 map<node,int>mp;
24 int main(){
25     scanf("%d",&t);
26     while(t--){
27         scanf("%d",&n);
28         scanf("%s",s+1);mp.clear();
29         int x=0,y=0;
30         mp[node(0,0)]=1000000;
31         int f=1,l,r,minb=maxn;
32         for(it i=1;i<=n;i++){
33             if(s[i]=='L'){
34                 x--;
35             }
36             else if(s[i]=='R'){
37                 x++;
38             }
39             else if(s[i]=='U'){
40                 y++;
41             }
42             else if(s[i]=='D'){
43                 y--;
44                 
45             }
46             if(mp[node(x,y)]==1000000){
47                 int kkk=i-1;
48                 if(kkk<minb){l=1;r=i;minb=kkk;}f=0;mp[node(x,y)]=i;
49             }
50             else if(mp[node(x,y)]){
51                 int kkk=i-mp[node(x,y)];
52                 if(kkk<minb){l=i-kkk+1;r=i;minb=kkk;}f=0;mp[node(x,y)]=i;
53                 }
54             else{
55                 mp[node(x,y)]=i;
56             }
57             //cout<<x<<y<<i<<endl;
58         }
59         if(f){
60             printf("-1\n");
61         }
62         else{
63             printf("%d %d\n",l,r);
64         }
65     }
66     return 0;
67 }
View Code

 

D

居然比c题开的快,因为c题题目读了半天,读不懂直接跳了

题意:a和b的攻击力,有n个h1~hn的血条怪,有k个使得b跳过技能的招数,问a有多少次可以杀死怪的最后一血

思路:h1~hn都余上(a+b)==sheng,sheng<=a,总值加一,sheng>a的部分求出需要的k==(sheng-1)/a,存下来排序求最大总值

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define il inline
 5 #define it register int
 6 #define lowbit(x) (x)&(-x)
 7 #define mem(a,b) memset(a,b,sizeof(a))
 8 #define mod 1000000007
 9 const int maxn=2e5+10;
10 int n,a,b,k,h,s[maxn];
11 int main(){
12     scanf("%d%d%d%d",&n,&a,&b,&k);
13     //int kk=__gcd(a,b);
14     int c=a+b;
15     int sum=0,t=0;
16     for(int i=0;i<n;i++){
17         scanf("%d",&h);
18         int sheng=h%c;
19         if(sheng==0){sheng=c;}
20         //cout<<sheng<<endl;
21         if(sheng<=a){
22               sum++;
23         }
24         else{
25         s[t++]=(sheng-1)/a;
26         }
27     }
28     sort(s,s+t);
29     for(it i=0;i<t;i++){
30         if(k>=s[i]){
31                   sum++;k-=s[i];
32         }
33         else{break;}
34     }
35     printf("%d\n",sum);
36     return 0;
37 }
View Code

 

E1

我吐血了,死因s[i]>=s[j],多了等号,因为c题搞了半天,当时c题的读题和一直判不好(0,0)点导致时间没有,一看E1这么简单,暴力来,然后wa到比赛结束

然后看了数据,彻夜难眠……因为是暴力,所以代码就不放出来了,等补完了E2,直接放E2的代码。

upd:原来E2是多个颜色,数据扩大,那就还是贴一下E1的暴力代码了

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define il inline
 5 #define it register int
 6 #define lowbit(x) (x)&(-x)
 7 #define mem(a,b) memset(a,b,sizeof(a))
 8 #define mod 1000000007
 9 const int maxn=2e5+10;
10 int n,a[500]={0};
11 char s[500];
12 int main(){
13     scanf("%d",&n);
14     scanf("%s",s);
15     a[0]=0;
16     int ff=1;
17     for(it i=1;i<n;i++){
18         for (int j=0;j<i; j++) {
19             if (s[j]>s[i]) {
20                 a[i]= 1;
21             }
22         }
23         for (int k=i+1;k<n; k++) {
24             if (s[i]>s[k] && a[i]==1) {
25                 ff = 0;
26                 break;
27             }
28         }
29         if(!ff){
30             break;
31         }
32  
33     }
34     if(ff){
35         printf("YES\n");
36         for(it i=0;i<n;i++){
37             printf(i==n-1?"%d\n":"%d",a[i]);
38         }
39     }
40     else{
41             printf("NO\n");
42     }
43     return 0;
44 }
View Code

 

不知道为什么……现在打比赛开局总会爆炸

posted @ 2020-02-05 11:58  ouluy  阅读(141)  评论(0编辑  收藏  举报