十一月天梯赛训练补题 11.4
A - Prime Square CodeForces - 1436B
代码:
1 #include <set> 2 #include <map> 3 #include <list> 4 #include <stack> 5 #include <queue> 6 #include <deque> 7 #include <cmath> 8 #include <string> 9 #include <vector> 10 #include <cstdio> 11 #include <cstring> 12 #include <cstdlib> 13 #include <sstream> 14 #include <iostream> 15 #include <algorithm> 16 //#include <unordered_map> 17 #define INF 0x3f3f3f3f 18 #define ll long long 19 #define ull unsigned long long 20 #define FILL(a,n,v) fill(a,a+n,v) 21 #define Mset(a,v) memset(a,v,sizeof a) 22 #define Mcpy(a,b) memcpy(a,b,sizeof b) //a=b 23 #define fcio ios::sync_with_stdio(false); cin.tie(0); cout.tie(0) 24 using namespace std; 25 const int maxn=1e5; 26 27 int t; 28 int n; 29 30 bool isprime(int x) 31 { 32 if(x<=1) return false; 33 for(int i=2;i*i<=x;i++) 34 { 35 if(x%i==0) return false; 36 } 37 return true; 38 } 39 40 int main() 41 { 42 cin>>t; 43 while(t--) 44 { 45 cin>>n; 46 if(isprime(n)) 47 { 48 for(int i=0;i<n;i++) 49 { 50 for(int j=0;j<n;j++) 51 { 52 cout<<1<<(j==n-1?'\n':' '); 53 } 54 } 55 } 56 else 57 { 58 int t=1; 59 while(1) 60 { 61 t++; 62 if(!isprime(t)&&isprime(t+n-1)) break; 63 } 64 65 for(int i=0;i<n;i++) 66 { 67 for(int j=0;j<n;j++) 68 { 69 if(i==j) cout<<t<<(j==n-1?'\n':' '); 70 else cout<<1<<(j==n-1?'\n':' '); 71 } 72 } 73 } 74 } 75 }
B - Extreme Subtraction CodeForces - 1443D
差分数组+思维
有一个长度为n的数组a。你可以进行无数次如下操作:
- a1~ai 减1
- ai~an减1
问能否使数组中的元素全部变成0
思路:
转化成一个差分问题。(假设差分数组为ans)要使数组中的全部数都为0,那么差分数组也必须为0且ans[1]=0。
那么我们来看两种操作对于差分数组有何影响:
操作1:ans[1]-1 且ans[i+1]+1。那么我们就可以凭借操作1,将差分数组中的负数变成0,同时减小ans[1]。
操作2:ans[i+1]-1且ans[n+1]+1。那么我们就可以凭借操作2,将差分数组中的正数变成0,而ans[n+1]为多少和我们并没有关系。
在最开始时ans[1]=a[1],所以只要差分数组的负数和的绝对值小于等于a[1],即输出YES,否则输出NO。
因为如果差分数组的负数和的绝对值大于a[1],那么要使后面的数都变成0,ans[1]就会变成负数,而并没有使ans[1]由负数变成0的操作,操作2只能使ans[1]由正数变成0,所以这样并不满足要求。
代码:
1 #include <set> 2 #include <map> 3 #include <list> 4 #include <stack> 5 #include <queue> 6 #include <deque> 7 #include <cmath> 8 #include <string> 9 #include <vector> 10 #include <cstdio> 11 #include <cstring> 12 #include <cstdlib> 13 #include <sstream> 14 #include <iostream> 15 #include <algorithm> 16 //#include <unordered_map> 17 #define INF 0x3f3f3f3f 18 #define ll long long 19 #define ull unsigned long long 20 #define FILL(a,n,v) fill(a,a+n,v) 21 #define Mset(a,v) memset(a,v,sizeof a) 22 #define Mcpy(a,b) memcpy(a,b,sizeof b) //a=b 23 #define fcio ios::sync_with_stdio(false); cin.tie(0); cout.tie(0) 24 #define fcin freopen("in.txt","r",stdin) 25 #define fcout freopen("out.txt","w",stdout) 26 using namespace std; 27 const int maxn=1e5+10; 28 int t; 29 int n; 30 int a[maxn]; 31 int d[maxn]; 32 33 int main() 34 { 35 // fcin; 36 fcio; 37 cin>>t; 38 while(t--) 39 { 40 cin>>n; 41 for(int i=1;i<=n;i++) cin>>a[i]; 42 d[1]=a[1]; 43 for(int i=2;i<=n;i++) d[i]=a[i]-a[i-1]; 44 45 int sum=0; 46 for(int i=2;i<=n;i++) if(d[i]<0) sum-=d[i]; 47 48 if(sum>d[1]) cout<<"NO"<<endl; 49 else cout<<"YES"<<endl; 50 } 51 return 0; 52 53 }
C - Palindromifier CodeForces - 1421C
思维+规律
题意:
给出一个字符串s,要求通过若干数量的操作1和操作2将s变为字符串。
字符串:s1s2s3s4...sn
操作1:
选择下标i,将s的子串s2s3s4...si逆序后加到s左边 即si...s4s3s2s1s2s3s4...sn
操作2:
选择下标i,将s的子串sn-1sn-2sn-3...si逆序后加到s的右边即s1s2s3s4...snsisi+1si+2...sn-1
题目不要求步数最短,所以考虑对于任何字符串的通用办法。
假设s=abcde
L 2 s-->babcde
R 2 s-->babcdedcba
R 9 s-->babcdedcbab
代码:
1 #include <set> 2 #include <map> 3 #include <list> 4 #include <stack> 5 #include <queue> 6 #include <deque> 7 #include <cmath> 8 #include <string> 9 #include <vector> 10 #include <cstdio> 11 #include <cstring> 12 #include <cstdlib> 13 #include <sstream> 14 #include <iostream> 15 #include <algorithm> 16 //#include <unordered_map> 17 #define INF 0x3f3f3f3f 18 #define ll long long 19 #define ull unsigned long long 20 #define FILL(a,n,v) fill(a,a+n,v) 21 #define Mset(a,v) memset(a,v,sizeof a) 22 #define Mcpy(a,b) memcpy(a,b,sizeof b) //a=b 23 #define fcio ios::sync_with_stdio(false); cin.tie(0); cout.tie(0) 24 #define fcin freopen("in.txt","r",stdin) 25 #define fcout freopen("out.txt","w",stdout) 26 using namespace std; 27 28 29 int main() 30 { 31 // fcin; 32 // fcout; 33 string s; 34 cin>>s; 35 36 cout<<3<<endl; 37 cout<<"L 2"<<endl; 38 cout<<"R 2"<<endl; 39 cout<<"R "<<s.length()*2-1<<endl; 40 return 0; 41 }