题意:输出一个从1-n的全排列,下标从1开始,每一位下标与数值不等。
思路:输出2-n后再输出1.
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define pii pair<int,int> 4 #define fi first 5 #define se second 6 #define pb push_back 7 #define Swap(a,b) {int temp=a;a=b;b=temp;} 8 typedef long long ll; 9 typedef unsigned long long ull; 10 11 int main(){ 12 int test; 13 scanf("%d",&test); 14 while(test--){ 15 int n; 16 scanf("%d",&n); 17 for(int i=1;i<n;i++){ 18 printf("%d ",i+1); 19 } 20 printf("1\n"); 21 } 22 }
题意:找到所有只出现过一次的元素中的最小值,假如找不到的话输出-1.
思路:题解的意思是记录每个元素的出现次数和任意一个出现位置,因为元素数据范围在1-2e5,可以从小到大遍历,把第一个出现次数为1的元素输出位置。我存了每个元素的所有位置再比大小,手滑少打了一个0,fst了。
AC代码:
#include<bits/stdc++.h> using namespace std; #define pii pair<int,int> #define fi first #define se second #define pb push_back #define Swap(a,b) {int temp=a;a=b;b=temp;} typedef long long ll; typedef unsigned long long ull; map<int,vector<int> > num_pos; int main(){ int test; scanf("%d",&test); while(test--){ int n; scanf("%d",&n); num_pos.clear(); int tmp; for(int i=1;i<=n;i++){ scanf("%d",&tmp); num_pos[tmp].pb(i); } int ans=200010,p=-1; //比赛的时候ans少打了一个0 for(auto x:num_pos){ auto num=x.fi; auto pos=x.se; if(pos.size()==1) { if(num<ans) p=pos[0],ans=num; } } printf("%d\n",p); } }
题意:选定一个元素,看它能把整个数组分成几块,输出最小能把数组分块的数量。
思路:统计每个元素的出现次数,分块数为出现次数+2,特判该元素是否出现在数组头或尾,假如有其中一种情况就让出现次数-1。
AC代码:
#include<bits/stdc++.h> using namespace std; #define pii pair<int,int> #define fi first #define se second #define pb push_back #define Swap(a,b) {int temp=a;a=b;b=temp;} typedef long long ll; typedef unsigned long long ull; map<int,int> mp; //数字,次数 int a[200010]; int main(){ int test; scanf("%d",&test); while(test--){ int n,fi,ls; mp.clear(); scanf("%d",&n); int tmp; for(int i=0;i<n;i++) { scanf("%d",&a[i]); if(i==0) fi=a[i]; //记录首个元素 if(i==n-1) ls=a[i]; //记录末尾元素 if(a[i]==a[i-1]) continue; mp[a[i]]++; } int ans=200000; for(auto x:mp){ int num=x.fi,time=x.se; tmp=x.se+1; if(fi==num) tmp--; //特判是否在头尾 if(ls==num) tmp--; ans=min(ans,tmp); } if(mp.size()==1) ans=0; printf("%d\n",ans); } }
题意:给定一个n,求出几个数乘积为n,并且这几个数每一个都是前一个的倍数,求出最长的这样的序列并输出。
思路:每一个数都是前一个数的倍数,即第一个数是所有数的公因子。将n分解质因数,找到质因子里次数最高的,假设最高次数为k,输出先前k-1个质因子,最后一个该质因子和其他所有质因子之积相乘。特判如果所有质因子都只出现一次,答案为1,输出n本身。
AC代码:
#include<bits/stdc++.h> using namespace std; #define pii pair<int,int> #define fi first #define se second #define pb push_back #define Swap(a,b) {int temp=a;a=b;b=temp;} typedef long long ll; typedef unsigned long long ull; unordered_map<ll,ll> primes; //哈希表存质因子/指数 void getprimes(ll x){ //分解质因子 primes.clear(); for(ll i=2;i<=x/i;i++){ ll res=0; while(x%i==0){ x/=i; res++; } if(res) primes[i]+=res; } if(x>1) primes[x]++; //最后没除尽 } int main(){ int test; scanf("%d",&test); while(test--){ ll n; scanf("%lld",&n); getprimes(n); ll d,times=-1; for(auto prime:primes){ ll a=prime.fi,b=prime.se; if(b>1){ if(b>times) d=a,times=b; } } if(times!=-1){ int cnt=0; while(times>1){ cnt++; n/=d; times--; } printf("%d\n",cnt+1); while(cnt--) printf("%d ",d); printf("%lld\n",n); } else printf("1\n%lld\n",n); } }
E待补……
Codeforces Round #686 (Div. 3)
原文:https://www.cnblogs.com/CandyLynch/p/14041202.html