Educational Codeforces Round 64 (Rated for Div. 2) A,B,C
阿新 • • 發佈:2019-05-02
16px 第三題 cat printf urn 例如 bsp != main
比賽鏈接:
https://codeforces.com/contest/1156
A. Inscribed Figures
題意:
給出$n(2\leq n\leq 100)$個數,只含有1,2,3,分別代表圓,高與底相等的三角形,正方形
$a_{i+1}$在$a_{i}$的裏面,$a_{i+1}$的面積盡可能的大
求不同的交點個數
分析:
註意正方形裏面一個圓,再裏面一個三角形的時候,有一個交點重合
ac代碼:
#include<bits/stdc++.h> #define ll long long using namespace std; const int maxn=1e5+10; const int maxm=200000*2+10; const int mod=1e9+7; int num[maxn]; ll ans; int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&num[i]); for(int i=2;i<=n;i++) { if(num[i]==1) { if(num[i-1]==2)ans+=3; if(num[i-1]==3)ans+=4; } if(num[i]==2) { if(num[i-1]==1) { if(i-2>=1&&num[i-2]==3) ans+=2; else ans+=3; } if(num[i-1]==3)ans=1e18; } if(num[i]==3) { if(num[i-1]==1)ans+=4; if(num[i-1]==2)ans=1e18; } } if(ans>=1e17) cout<<"Infinite"<<endl; else { cout<<"Finite"<<endl; cout<<ans<<endl; } return 0; }
B. Ugly Pairs
題意:
給出一個字符串$s(1\leq |s|\leq 100)$,重排它們,讓每對相鄰的字符在$ascii$表中不相鄰
分析:
將$a,c,e,g...$放一個集合,將$b,d,f,h...$放另一個集合,看它們是否能連線在一起
ac代碼:
#include<bits/stdc++.h> #define ll long long using namespace std; const int maxn=100+10; const int maxm=200000*2+10; const int mod=1e9+7; int num[30]; char word[maxn]; int main() { int T; scanf("%d",&T); while(T--) { getchar(); scanf("%s",word); int gkd=0; for(int i=0;word[i];i++) if((int)word[i]%2!=(int)word[0]%2)gkd=1; if(gkd==0) { printf("%s\n",word); continue; } memset(num,0,sizeof(num)); for(int i=0; word[i]; i++) num[word[i]-‘a‘]++; int a,b,fla=0; for( int i=0; i<26; i++) for(int j=0; j<26; j++) if(i%2==0&&j%2==1&&abs(i-j)!=1&&num[j]&&num[i]) { a=i,b=j; fla=1; } if(fla==0) { printf("No answer\n"); continue; } num[a]--; num[b]--; for(int i=0; i<26; i+=2) for(int j=0; j<num[i]; j++) printf("%c",(char)(i+‘a‘)); printf("%c%c",(char)(a+‘a‘),(char)(b+‘a‘)); for(int i=1; i<26; i+=2) for(int j=0; j<num[i]; j++) printf("%c",(char)(i+‘a‘)); printf("\n"); } return 0; }
C. Match Points
題意:
給出n個數,組成最多的數對,滿足$|a_i-a_j|\geq d$
分析:
這題一看就是貪心,但是,我的策略是,用最小的去匹配最小能匹配的,wa
例如:
4 2
1 3 4 7
最優解是$(1,4)(3,7)$
正確匹配方式是,用前面一部分匹配後面一部分
ac代碼:
#include<bits/stdc++.h> #define ll long long using namespace std; const int maxn=2e5+10; const int maxm=200000*2+10; const int mod=1e9+7; int n,d,num[maxn]; bool check(int x) { int a=x,b=n; for(;a>=1;a--,b--) if(num[b]-num[a]<d)return 0; return 1; } int main() { scanf("%d %d",&n,&d); for(int i=1;i<=n;i++) scanf("%d",&num[i]); sort(num+1,num+1+n); int st=0,en=n/2; while(st!=en) { int md=(st+en)/2; if(check(md+1))st=md+1; else en=md; } printf("%d\n",st); return 0; }
總結:
第一題沒考慮到交點重合的情況,wa了很多發,我應該模擬所有情況的
第二題比賽的時候沒有思路
第三題貪心的策略錯了,導致wa了還不知道原因
貪心是最難的算法Orz
Educational Codeforces Round 64 (Rated for Div. 2) A,B,C