ACMC6

    科技2022-08-09  97

    A - Suborrays CodeForces - 1391A

    题意:找一个序列(从1到n,每个数字只出现一次),使序列中的第i到第j(i,j大于等于1且小于等于n, j大于等于i)个元素的或大于等于j-i+1。 思路:j-i+1实际上就是子序列长,第i到第j个元素的或大于等于该子序列的最大值,而一个长为n的子序列中的 最大值一定大于等于n,则实际上任意序列均成立。 #include <bits/stdc++.h> using namespace std; int main() { int t; cin >> t; while (t--) { int n; cin >> n; for (int i = n; i >= 1; i--) printf("%d ",i);//随便一个序列都行 cout << endl; } //system("pause"); return 0; }

    B - Fix You CodeForces - 1391B

    除右边界和下边界的值不管是什么,最终都会使这些范围内的起点到达这两边界,则只需要将下边界的D变R, 右边界的R变D即可 #include <bits/stdc++.h> using namespace std; int main() { int n; cin>>n; while(n--) { int a,b; cin>>a>>b; int sum=0; char c; for(int i=0;i<a;i++) { for(int j=0;j<b;j++) { cin>>c; if(j==b-1&&c=='R') sum++; else if(i==a-1&&c=='D') sum++; } } cout<<sum<<endl; } //system("pause"); return 0; }

    C - Cyclic Permutations CodeForces - 1391C

    可知,只要序列中有x,y,z(y小于x和z)即可成环(y与xz连,x与z连,形成一个3元素环),即只要序列中 存在山谷就行。可以运用容斥原理,抛去只有山峰的情况,设最大值在第i位,则其左边是递增子序列,右边是 递减子序列,而只要确定左侧的情况,右侧就只有一种情况可选。而左侧有i-1个元素,从n-1个元素里挑选, i可取1-n,即总情况为(C是组合数符号)C(n-1)(0)+C(n-1)(1)+.....+C(n-1)(n-1),2^(n-1). #include <bits/stdc++.h> using namespace std; const int mod = 1e9 + 7; typedef long long ll; int main() { int n; cin>>n; ll sum=1; ll re=1; for(int i=1;i<=n;i++) { sum=sum*i%mod; if(i!=1) re=re*2%mod; } cout<<((sum-re)+mod)%mod<<endl;//取mod后sum可能小于re //system("pause"); return 0; } 此题涉及到了取mod防超界的问题,则一切较大的数均应取mod,且取mod后的数相减出现了不该出现的负值, 要将这种情况再次通过取mod化为正数.

    待补全ing

    Processed: 0.014, SQL: 8