排序+暴力
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 #define int long long 6 #define N 1005000 7 int arr[N]; 8 9 signed main(){ 10 int _,n; 11 cin>>_; 12 while(_--){ 13 cin>>n; 14 for(int i=1;i<=n;i++) 15 cin>>arr[i]; 16 sort(arr+1,arr+1+n); 17 int ans=0; 18 for(int i=1;i<=n;i++){ 19 int flag=0; 20 int s=0; 21 for(int j=n;j>=1;j--){ 22 if(arr[j]>=i) 23 s++; 24 if(s>=i){ 25 flag=1; 26 break; 27 } 28 } 29 if(flag){ 30 ans=i; 31 }else{ 32 break; 33 } 34 } 35 cout<<ans<<' '; 36 } 37 return 0; 38 }
直接暴力就行。【数据范围看错了。少开了一个0。啊啊,难受QAQ。。。。。。。】
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 #define int long long 6 #define N 1500 7 int a[N]; 8 signed main(){ 9 int _; 10 cin>>_; 11 while(_--){ 12 int n; 13 cin>>n; 14 string s1,s2; 15 cin>>s1>>s2; 16 if(s1==s2){ 17 printf("Yes "); 18 continue; 19 } 20 int flag=0;int s=0; 21 22 memset(a,0,sizeof(a)); 23 int cnt=0; 24 for(int i=0;i<s1.size();i++){ 25 if(s1[i]!=s2[i]){ 26 a[cnt++]=i; 27 s++; 28 } 29 if(s>2){ 30 break; 31 } 32 } 33 if(s!=2){ 34 printf("No "); 35 }else{ 36 if((s1[a[0]]==s1[a[1]]&&s2[a[0]]==s2[a[1]])){ 37 printf("Yes "); 38 }else{ 39 printf("No "); 40 } 41 } 42 } 43 return 0; 44 }
思路:当字符串不相等时,优先考虑同行。当同行没有字符串时再考虑另外一行。模拟即可。
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 #define int long long 5 6 signed main(){ 7 int _; 8 cin>>_; 9 while(_--){ 10 int n; 11 cin>>n; 12 string s1,s2; 13 cin>>s1>>s2; 14 int sum=0;int X=0; 15 vector<pair<int,int> > ans; 16 for(int i=0;i<n;i++){ 17 if(s1[i]!=s2[i]){ 18 int flag1=0;int flag2=0; 19 for(int j=i+1;j<n;j++){ 20 if(s1[j]==s1[i]){ 21 flag1=1; 22 sum++; 23 ans.push_back(make_pair(j+1,i+1)); 24 swap(s1[j],s2[i]); 25 break; 26 } 27 } 28 if(!flag1){ 29 for(int j=i+1;j<s2.size();j++){ 30 if(s2[j]==s1[i]){ 31 sum+=2; 32 flag2=1; 33 ans.push_back(make_pair(j+1,j+1)); 34 ans.push_back(make_pair(j+1,1+i)); 35 swap(s2[j],s1[j]); 36 swap(s1[j],s2[i]); 37 break; 38 } 39 } 40 } 41 if(flag1==0&&flag2==0){ 42 X=1; 43 break; 44 } 45 } 46 } 47 if(X){ 48 printf("No "); 49 continue; 50 } 51 if(sum<=2*n){ 52 printf("Yes "); 53 printf("%lld ",sum); 54 for(int i=0;i<ans.size();i++){ 55 cout<<ans[i].first<<" "<<ans[i].second<<' '; 56 } 57 }else{ 58 printf("No "); 59 } 60 } 61 return 0; 62 }
题意:给排成一行的 n个格子,要求所有的 i,j 满足 |i−j|是 n 的因子的,都要同色,求最大的涂色数。
思路:所有因子的GCD。
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 #define int long long 6 7 signed main(){ 8 int n;cin>>n; 9 int ans=1; 10 int flag=0; 11 int K=0; 12 for(int i=2;i*i<=n;i++){ 13 if(n%i==0){ 14 flag=1; 15 if(!K){ 16 ans=i; 17 ans=__gcd(ans,n/i); 18 K=1; 19 }else{ 20 ans=__gcd(ans,i); 21 ans=__gcd(ans,n/i); 22 } 23 } 24 } 25 if(flag==0){ 26 cout<<n<<' '; 27 return 0; 28 } 29 cout<<ans; 30 return 0; 31 }
菜是原罪。