A:http://codeforces.com/contest/1372/problem/A
解析:
没得说,没想到这次A这么简单,全输出1就行了
#include<cstdio> #include<stack> #include<map> #include<set> #include<queue> #include<cstring> #include<iostream> #include<algorithm> using namespace std; priority_queue<int,vector<int>,greater<int> > q;//ó??è?aD?μ?ó??è?óáD typedef long long ll; const int maxn=1e3+20; int a[maxn],b[maxn]; int pos[maxn]; int top=0; int ok=0; int vis[maxn]; int n,k; struct node { int x,id; }st[maxn]; bool cmp(node a , node b) { if(a.x==b.x) return a.id<b.id; return a.x<b.x; } bool check() { for(int i=1;i<n;i++) { if(a[i]>a[i+1]) return true; } return false; } int main() { // 4 0 20 int t; cin>>t; while(t--) { int n; cin>>n; for(int i=1;i<=n;i++) cout<<"1 "; cout<<endl; } }
B:http://codeforces.com/contest/1372/problem/B
题意:
给出n
找出a,b。满足a+b=n,lcm(a,b)是最小的
解析:
a*b/gcd(a,b)=lcm(a,b)
lcm最小,那么gcd最大
如果a,b互质,那么gcd为1,所以对于n为非素数的情况,需要找出n的最大因子a
a为n的因子,那么n-a也为n的因子
满足了:
max gcd=gcd(a,n-a)=a
min lcm=lcm(a,n-a)=n-a
#include<cstdio> #include<stack> #include<map> #include<set> #include<cmath> #include<queue> #include<cstring> #include<iostream> #include<algorithm> using namespace std; priority_queue<int,vector<int>,greater<int> > q;//ó??è?aD?μ?ó??è?óáD typedef long long ll; const int maxn=1e3+20; int a[maxn],b[maxn]; int pos[maxn]; int top=0; int ok=0; int vis[maxn]; int n,k; struct node { int x,id; }st[maxn]; bool cmp(node a , node b) { if(a.x==b.x) return a.id<b.id; return a.x<b.x; } int main() { // 4 0 20 int t; cin>>t; while(t--) { ll n; cin>>n; int ok = 0; ll md; for(int i=2;i<=sqrt(n);i++) { if(n%i==0) { md=n/i;ok=1;break; } } if(!ok) cout<<"1 "<<n-1<<endl; else cout<<md<<" "<<n-md<<endl; } }
C:http://codeforces.com/contest/1372/problem/C
题意:
给出长度为n的数组,含数字1~n
操作:
找出[l,r],对区间内的数字进行任意排序,条件是任何一位不能和排序之前相同
求最少操作数,使得数组变为:1,2,3....n
解析:
求初始数组ai==i的数目tot
tot==n:0
tot==0:1(此时对整个区间进行一次排序即可恢复)
0<tot<n:
分两种情况
(1) 正常...乱序...正常
这个时候,只需要把乱序部分进行一次排序,即可恢复,所以只需要1次操作。
(2)正常...乱序正常乱序...正常
中间发生了交替,那么先把整个区间进行一次操作,打乱它们,然后再对整个区间重排,即可恢复。操作数为2次。
#include<cstdio> #include<stack> #include<map> #include<set> #include<cmath> #include<queue> #include<cstring> #include<iostream> #include<algorithm> using namespace std; priority_queue<int,vector<int>,greater<int> > q;//ó??è?aD?μ?ó??è?óáD typedef long long ll; const int maxn=2e5+20; int a[maxn],b[maxn]; int pos[maxn]; int top=0; int ok=0; int vis[maxn]; int n,k; struct node { int x,id; }st[maxn]; bool cmp(node a , node b) { if(a.x==b.x) return a.id<b.id; return a.x<b.x; } int main() { // 4 0 20 int t; cin>>t; while(t--) { int n; cin>>n; int ok = 0; int tot=0; for(int i=1;i<=n;i++) { cin>>a[i]; if(a[i]!=i) { tot++; } } if(tot==0) cout<<"0"<<endl; else if(tot==n) cout<<"1"<<endl; else { int l=1,r=n; for(int i=1;i<=n;i++) { if(a[i]!=i) break; l++; } for(int i=n;i>=1;i--) { if(a[i]!=i) break; r--; } int ok =0; // l之前,r之后,均为有序。 for(int i=l+1;i<=r-1;i++) { if(a[i]==i) { ok=1;break; } } // cout<<l<<"-"<<r<<endl; if(ok) cout<<"2"<<endl; else cout<<"1"<<endl; } } }