byl太強了,學弟們太強了~全程被吊打,嚶嚶嚶~html
http://codeforces.com/problemset/problem/888/Fios
不會c++
http://codeforces.com/problemset/problem/888/Aide
給一列數字,判斷一個數它的左右是否同時比它大,或者同時比它小,若知足的話那麼count++,獲得最後的count值,那麼很明顯,直接暴力的遍歷一遍就能夠了。spa
1 #include <bits/stdc++.h> 2 #define ll long long 3 #define ull unsigned long long 4 #define ms(a,b) memset(a,b,sizeof(a)) 5 const int inf=0x3f3f3f3f; 6 const ll INF=0x3f3f3f3f3f3f3f3f; 7 const int maxn=1e6+10; 8 const int mod=1e9+7; 9 const int maxm=1e3+10; 10 using namespace std; 11 int a[maxn]; 12 int main(int argc, char const *argv[]) 13 { 14 #ifndef ONLINE_JUDGE 15 freopen("in.txt", "r", stdin); 16 freopen("out.txt", "w", stdout); 17 srand((unsigned int)time(NULL)); 18 #endif 19 ios::sync_with_stdio(false); 20 cin.tie(0); 21 int n; 22 cin>>n; 23 for(int i=1;i<=n;i++) 24 cin>>a[i]; 25 int ans=0; 26 for(int i=2;i<n;i++) 27 { 28 if(a[i]<a[i-1]&&a[i]<a[i+1]) 29 ans++; 30 if(a[i]>a[i-1]&&a[i]>a[i+1]) 31 ans++; 32 } 33 cout<<ans<<endl; 34 #ifndef ONLINE_JUDGE 35 cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s."<<endl; 36 #endif 37 return 0; 38 }
http://codeforces.com/problemset/problem/888/Gcode
不會htm
http://codeforces.com/problemset/problem/888/Bblog
機器人有四種指令,找出在給出的一大串指令中,最多有多少指令是正確的排序
找到LR和UD有多少對,乘以2就好了ci
1 #include <bits/stdc++.h> 2 #define ll long long 3 #define ull unsigned long long 4 #define ms(a,b) memset(a,b,sizeof(a)) 5 const int inf=0x3f3f3f3f; 6 const ll INF=0x3f3f3f3f3f3f3f3f; 7 const int maxn=1e6+10; 8 const int mod=1e9+7; 9 const int maxm=1e3+10; 10 using namespace std; 11 int main(int argc, char const *argv[]) 12 { 13 #ifndef ONLINE_JUDGE 14 freopen("in.txt", "r", stdin); 15 freopen("out.txt", "w", stdout); 16 srand((unsigned int)time(NULL)); 17 #endif 18 ios::sync_with_stdio(false); 19 cin.tie(0); 20 int n; 21 cin>>n; 22 string s; 23 cin>>s; 24 map<char,int>mp; 25 for(int i=0;i<n;i++) 26 mp[s[i]]++; 27 int ans=0; 28 ans+=min(mp['L'],mp['R']); 29 ans+=min(mp['U'],mp['D']); 30 cout<<ans*2<<endl; 31 #ifndef ONLINE_JUDGE 32 cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s."<<endl; 33 #endif 34 return 0; 35 }
http://codeforces.com/problemset/problem/888/C
給出一個字符串,找出一個最小的長度k,使得每一個長度爲k的子串中都包含一個相同的字符記錄下來每一個字符的位置,找兩個相同字符的最大距離,對這個最大距離取最小值
1 #include <bits/stdc++.h> 2 #define ll long long 3 #define ull unsigned long long 4 #define ms(a,b) memset(a,b,sizeof(a)) 5 const int inf=0x3f3f3f3f; 6 const ll INF=0x3f3f3f3f3f3f3f3f; 7 const int maxn=1e6+10; 8 const int mod=1e9+7; 9 const int maxm=1e3+10; 10 using namespace std; 11 int main(int argc, char const *argv[]) 12 { 13 #ifndef ONLINE_JUDGE 14 freopen("in.txt", "r", stdin); 15 freopen("out.txt", "w", stdout); 16 srand((unsigned int)time(NULL)); 17 #endif 18 ios::sync_with_stdio(false); 19 cin.tie(0); 20 string s; 21 cin>>s; 22 int l=s.length(); 23 vector<int>ve[30]; 24 for(int i=0;i<26;i++) 25 ve[i].push_back(-1); 26 for(int i=0;i<l;i++) 27 ve[s[i]-'a'].push_back(i); 28 for(int i=0;i<26;i++) 29 ve[i].push_back(l); 30 int ans=inf; 31 for(int i=0;i<26;i++) 32 { 33 int res=0; 34 int sz=ve[i].size(); 35 for(int j=1;j<sz-1;j++) 36 res=max(res,max(ve[i][j]-ve[i][j-1],ve[i][j+1]-ve[i][j])); 37 if(res==0) 38 continue; 39 ans=min(ans,res); 40 } 41 cout<<ans<<endl; 42 #ifndef ONLINE_JUDGE 43 cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s."<<endl; 44 #endif 45 return 0; 46 }
http://codeforces.com/problemset/problem/888/E
給出n個數,從這n個數中選出幾個數(能夠不選),使得這些數的和對m取餘後的值最大
題解連接:http://www.javashuo.com/article/p-aswqpzlj-ha.html
1 #include <bits/stdc++.h> 2 #define ll long long 3 #define ull unsigned long long 4 #define ms(a,b) memset(a,b,sizeof(a)) 5 const int inf=0x3f3f3f3f; 6 const ll INF=0x3f3f3f3f3f3f3f3f; 7 const int maxn=1e6+10; 8 const int mod=1e9+7; 9 const int maxm=1e3+10; 10 using namespace std; 11 int a[maxn]; 12 int Left[maxn]; 13 int Right[maxn]; 14 int cntl,cntr; 15 int n,m; 16 int main(int argc, char const *argv[]) 17 { 18 #ifndef ONLINE_JUDGE 19 freopen("in.txt", "r", stdin); 20 freopen("out.txt", "w", stdout); 21 srand((unsigned int)time(NULL)); 22 #endif 23 ios::sync_with_stdio(false); 24 cin.tie(0); 25 cin>>n>>m; 26 for(int i=0;i<n;i++) 27 cin>>a[i],a[i]%=m; 28 int res=0; 29 int l,r; 30 l=r=n/2; 31 for(int i=0;i<(1<<r);i++) 32 { 33 res=0; 34 for(int j=0;j<r;j++) 35 if(i>>j&1) 36 res+=a[j],res%=m; 37 Left[cntl++]=res; 38 } 39 res=0; 40 r=n; 41 int num=r-l+1; 42 for(int i=0;i<(1<<num);i++) 43 { 44 res=0; 45 for(int j=0;j<num;j++) 46 if(i>>j&1) 47 res+=a[l+j],res%=m; 48 Right[cntr++]=res; 49 } 50 Left[cntl++]=0; 51 Right[cntr++]=0; 52 sort(Left,Left+cntl); 53 sort(Right,Right+cntr); 54 cntl=unique(Left,Left+cntl)-Left; 55 cntr=unique(Right,Right+cntr)-Right; 56 int ans=0; 57 for(int i=0;i<cntl;i++) 58 { 59 int res=m-Left[i]-1; 60 int pos=upper_bound(Right,Right+cntr,res)-Right; 61 int num=Right[pos-1]; 62 ans=max(ans%m,(num+Left[i])%m); 63 } 64 cout<<ans<<endl; 65 #ifndef ONLINE_JUDGE 66 cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s."<<endl; 67 #endif 68 return 0; 69 }
http://codeforces.com/problemset/problem/888/D
給出n的全排列,求有多少種排列,知足至少n−k個位置上的數和下標相同(下標從1開始)
錯排公式+組合數
題解連接:http://www.javashuo.com/article/p-slggzloy-hg.html
1 #include <bits/stdc++.h> 2 #define ll long long 3 #define ull unsigned long long 4 #define ms(a,b) memset(a,b,sizeof(a)) 5 const int inf=0x3f3f3f3f; 6 const ll INF=0x3f3f3f3f3f3f3f3f; 7 const int maxn=1e6+10; 8 const int mod=1e9+7; 9 const int maxm=1e3+10; 10 using namespace std; 11 ll C(int n,int m) 12 { 13 ll fenmu=1LL; 14 ll fenzi=1LL; 15 for(int i=1;i<=m;i++) 16 { 17 fenmu=1LL*fenmu*(n-i+1); 18 fenzi=1LL*fenzi*i; 19 } 20 return fenmu/fenzi; 21 } 22 int main(int argc, char const *argv[]) 23 { 24 #ifndef ONLINE_JUDGE 25 freopen("in.txt", "r", stdin); 26 freopen("out.txt", "w", stdout); 27 srand((unsigned int)time(NULL)); 28 #endif 29 ios::sync_with_stdio(false); 30 cin.tie(0); 31 int n,k; 32 cin>>n>>k; 33 ll ans=0; 34 if(k>=1) 35 ans+=1; 36 if(k>=2) 37 ans+=(n*(n-1)/2); 38 if(k>=3) 39 ans+=2*C(n,3); 40 if(k>=4) 41 ans+=9*C(n,4); 42 cout<<ans<<endl; 43 #ifndef ONLINE_JUDGE 44 cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s."<<endl; 45 #endif 46 return 0; 47 }
http://codeforces.com/problemset/problem/777/C
給出一個n×m的矩陣,判斷第l行~第r行中是否有一列是非遞減的
預處理每一行能往上延伸到的位置,注意矩陣的存法
題解連接:http://www.javashuo.com/article/p-ahlstlpp-hq.html
1 #include <bits/stdc++.h> 2 #define ll long long 3 #define ull unsigned long long 4 #define ms(a,b) memset(a,b,sizeof(a)) 5 const int inf=0x3f3f3f3f; 6 const ll INF=0x3f3f3f3f3f3f3f3f; 7 const int maxn=1e6+10; 8 const int mod=1e9+7; 9 const int maxm=1e3+10; 10 using namespace std; 11 vector<int>ve[maxn]; 12 // 當前行能往上延伸的最高位置 13 int can[maxn]; 14 // 當前列能往上的最高位置 15 int line[maxn]; 16 int main(int argc, char const *argv[]) 17 { 18 #ifndef ONLINE_JUDGE 19 freopen("in.txt", "r", stdin); 20 freopen("out.txt", "w", stdout); 21 srand((unsigned int)time(NULL)); 22 #endif 23 ios::sync_with_stdio(false); 24 cin.tie(0); 25 int n,m; 26 cin>>n>>m; 27 int x; 28 for(int i=0;i<m;i++) 29 ve[0].push_back(0); 30 for(int i=1;i<=n;i++) 31 for(int j=0;j<m;j++) 32 cin>>x,ve[i].push_back(x); 33 for(int i=1;i<=n;i++) 34 { 35 can[i]=i; 36 for(int j=0;j<m;j++) 37 { 38 int now_num=ve[i][j]; 39 int up_num=ve[i-1][j]; 40 if(now_num<up_num) 41 line[j]=i; 42 can[i]=min(can[i],line[j]); 43 } 44 } 45 int t; 46 cin>>t; 47 while(t--) 48 { 49 int l,r; 50 cin>>l>>r; 51 if(can[r]>l) 52 cout<<"No\n"; 53 else 54 cout<<"Yes\n"; 55 } 56 #ifndef ONLINE_JUDGE 57 cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s."<<endl; 58 #endif 59 return 0; 60 }
http://codeforces.com/problemset/problem/777/A
如今一共有三個小盒子,其中有一個盒子中有小球.一共進行了n次操做,操做規律有:
①奇數次操做,交換第一個和中間的盒子。
②偶數次操做,交換第三個和中間的盒子。
如今已知操做了n次以後小球在x號盒子中(0,1,2),問初始的時候小球在哪裏
循環節,每六個數字一個循環
1 #include <bits/stdc++.h> 2 #define ll long long 3 #define ull unsigned long long 4 #define ms(a,b) memset(a,b,sizeof(a)) 5 const int inf=0x3f3f3f3f; 6 const ll INF=0x3f3f3f3f3f3f3f3f; 7 const int maxn=1e6+10; 8 const int mod=1e9+7; 9 const int maxm=1e3+10; 10 using namespace std; 11 int main(int argc, char const *argv[]) 12 { 13 #ifndef ONLINE_JUDGE 14 freopen("in.txt", "r", stdin); 15 freopen("out.txt", "w", stdout); 16 srand((unsigned int)time(NULL)); 17 #endif 18 ios::sync_with_stdio(false); 19 cin.tie(0); 20 int a[6][3]={{0,1,2},{1,0,2},{1,2,0},{2,1,0},{2,0,1},{0,2,1}}; 21 int n,x; 22 cin>>n>>x; 23 n%=6; 24 cout<<a[n][x]<<endl; 25 #ifndef ONLINE_JUDGE 26 cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s."<<endl; 27 #endif 28 return 0; 29 }
http://codeforces.com/problemset/problem/777/E
有n個空心圓柱體,第i個圓柱體的內徑、外徑、高分別爲:ai,bi,hi。將這些圓柱體堆起來,要求:從上到下,外徑非遞減,而且上面的外徑小於下面的內徑。問最高能堆多高
貪心,用棧維護
題解連接:http://www.javashuo.com/article/p-wieycrlo-gb.html
1 #include <bits/stdc++.h> 2 #define ll long long 3 #define ull unsigned long long 4 #define ms(a,b) memset(a,b,sizeof(a)) 5 const int inf=0x3f3f3f3f; 6 const ll INF=0x3f3f3f3f3f3f3f3f; 7 const int maxn=1e6+10; 8 const int mod=1e9+7; 9 const int maxm=1e3+10; 10 using namespace std; 11 struct wzy 12 { 13 int a,b,h; 14 }p[maxn]; 15 bool cmp(wzy u,wzy v) 16 { 17 if(u.b==v.b) 18 { 19 if(u.a==v.a) 20 return u.h>v.h; 21 return u.a>v.a; 22 } 23 return u.b>v.b; 24 } 25 int main(int argc, char const *argv[]) 26 { 27 #ifndef ONLINE_JUDGE 28 freopen("/home/wzy/in.txt", "r", stdin); 29 freopen("/home/wzy/out.txt", "w", stdout); 30 srand((unsigned int)time(NULL)); 31 #endif 32 ios::sync_with_stdio(false); 33 cin.tie(0); 34 int n; 35 cin>>n; 36 for(int i=1;i<=n;i++) 37 cin>>p[i].a>>p[i].b>>p[i].h; 38 sort(p+1,p+1+n,cmp); 39 ll ans=1LL*p[1].h; 40 ll sum=1LL*p[1].h; 41 stack<wzy>st; 42 st.push(p[1]); 43 for(int i=2;i<=n;i++) 44 { 45 while(!st.empty()&&(st.top().a>=p[i].b||st.top().b<p[i].b)) 46 { 47 sum-=1LL*st.top().h; 48 st.pop(); 49 } 50 sum+=1LL*p[i].h; 51 st.push(p[i]); 52 ans=max(ans,sum); 53 } 54 cout<<ans<<endl; 55 #ifndef ONLINE_JUDGE 56 cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s."<<endl; 57 #endif 58 return 0; 59 }
http://codeforces.com/contest/777/problem/D
n個字符串,要求不改變位置,刪除最少的字符串的後綴,使這些字符串按照字典序非遞減的順序排列
暴力便可
題解連接:http://www.javashuo.com/article/p-skykstax-ht.html
1 #include <bits/stdc++.h> 2 #define ll long long 3 #define ull unsigned long long 4 #define ms(a,b) memset(a,b,sizeof(a)) 5 const int inf=0x3f3f3f3f; 6 const ll INF=0x3f3f3f3f3f3f3f3f; 7 const int maxn=1e6+10; 8 const int mod=1e9+7; 9 const int maxm=1e3+10; 10 using namespace std; 11 vector<string>ve; 12 vector<string>ans; 13 int get_place(string s1,string s2) 14 { 15 int l1=s1.length(); 16 int l2=s2.length(); 17 int i; 18 for(i=0;i<min(l2,l1);i++) 19 { 20 if(s1[i]<s2[i]) 21 return l1; 22 if(s1[i]==s2[i]) 23 continue; 24 if(s1[i]>s2[i]) 25 return i; 26 } 27 if(i==l2) 28 { 29 if(l1>l2) 30 { 31 if(s1[i-1]==s2[i-1]) 32 return l2; 33 else 34 return l1; 35 } 36 } 37 return l1; 38 } 39 int main(int argc, char const *argv[]) 40 { 41 #ifndef ONLINE_JUDGE 42 freopen("in.txt", "r", stdin); 43 freopen("out.txt", "w", stdout); 44 srand((unsigned int)time(NULL)); 45 #endif 46 ios::sync_with_stdio(false); 47 cin.tie(0); 48 int n; 49 cin>>n; 50 string s; 51 for(int i=0;i<n;i++) 52 { 53 cin>>s; 54 ve.push_back(s); 55 } 56 string s1,s2; 57 ans.push_back(ve[n-1]); 58 for(int i=n-2;i>=0;i--) 59 { 60 s1=ve[i]; 61 s2=ans[n-(i+2)]; 62 int pos=get_place(s1,s2); 63 string ss; 64 ss=s1.substr(0,pos); 65 ans.push_back(ss); 66 } 67 for(int i=n-1;i>0;i--) 68 cout<<ans[i]<<endl; 69 cout<<ve[n-1]<<endl; 70 #ifndef ONLINE_JUDGE 71 cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s."<<endl; 72 #endif 73 return 0; 74 }
http://codeforces.com/contest/777/problem/B
Sherlock和Moriarty有n張卡片,每一個卡片上有一個數字,如今有Sherlock和Moriarty 兩我的在比較這些卡片上的數字大小,小的數字須要接受懲罰,Sherlock的卡片順序是固定的,Moriarty的卡片順序能夠隨意變更,求Moriarty的最小接受懲罰次數是多少,Sherlock最大懲罰對方的次數是多少
排序比較便可
題解連接:http://www.javashuo.com/article/p-fuuowqjl-hx.html
1 #include <bits/stdc++.h> 2 #define ll long long 3 #define ull unsigned long long 4 #define ms(a,b) memset(a,b,sizeof(a)) 5 const int inf=0x3f3f3f3f; 6 const ll INF=0x3f3f3f3f3f3f3f3f; 7 const int maxn=1e6+10; 8 const int mod=1e9+7; 9 const int maxm=1e3+10; 10 using namespace std; 11 int s[maxn],m[maxn]; 12 int nums[100],numm[100]; 13 int main(int argc, char const *argv[]) 14 { 15 #ifndef ONLINE_JUDGE 16 freopen("in.txt", "r", stdin); 17 freopen("out.txt", "w", stdout); 18 srand((unsigned int)time(NULL)); 19 #endif 20 ios::sync_with_stdio(false); 21 cin.tie(0); 22 int n; 23 string s1,s2; 24 cin>>n; 25 cin>>s1>>s2; 26 for(int i=0;i<n;i++) 27 s[i]=s1[i]-'0',m[i]=s2[i]-'0'; 28 sort(s,s+n); 29 sort(m,m+n); 30 int pos1=0; 31 int pos2=0; 32 int res1=0; 33 int res2=0; 34 for(int i=0;i<n;i++) 35 { 36 if(pos1>=n&&pos2>=n) 37 break; 38 while(pos1<n&&m[pos1]<s[i]) 39 pos1++; 40 while(pos2<n&&m[pos2]<=s[i]) 41 pos2++; 42 if(pos1<n) 43 res1++,pos1++; 44 if(pos2<n) 45 res2++,pos2++; 46 } 47 cout<<n-res1<<endl; 48 cout<<res2<<endl; 49 #ifndef ONLINE_JUDGE 50 cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s."<<endl; 51 #endif 52 return 0; 53 }