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
我吐血了,死因NO小写了,因为c题搞了半天,当时c题的读题和一直判不好(0,0)点导致时间没有,一看E1这么简单,暴力来,然后wa到比赛结束
然后看了数据,彻夜难眠……因为是暴力,所以代码就不放出来了,等补完了E2,直接放E2的代码。
不知道为什么……现在打比赛开局总会爆炸