题意:给n,若有n个数能按规定的排序方式输出-1,若不可以输出反例
类似于冒泡法排序,但没有内层排序
只有n=1或n=2的时候可以正确排序
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int main(){ int n,i; cin>>n; if(n==1||n==2){ cout<<"-1"<<endl; }else{ for(i=n;i>3;i--){ cout<<i<<‘ ‘; } cout<<"2 3 1"<<endl; } return 0; }
题意:从给定的数组中选两个数一个加一,一个减一,求最后得到相同的数最多有几个
加一减一会抵消最后的和不变,如果这n个数的和能被n整除则最后相同的最多有n个
反之,会对其中一个数一直进行操作,所以最后相同的最多有n-1个
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int a[100010]; int main(){ int n,i,j,sum=0; cin>>n; for(i=1;i<=n;i++){ cin>>a[i]; sum+=a[i]; } if(sum%n==0){ cout<<n<<endl; }else{ cout<<n-1<<endl; } return 0; }
题意:n个数a[i] 每天可以选任意个数,一共选k天,使每天的和不同,每个人同一天只能选一次
先从一个人的开始,a[1]、a[2]、....a[n] 有n种;
选两个人的时候,a[1] a[2] a[1]a[3] ..... a[1]a[n] 有n-1种,以此类推
一共有 n+n-1+n-2+....+1=(n+1)*n/2>=k;
#include<iostream> #include<algorithm> #include<cstdio> #include<cmath> using namespace std; int a[55]; int main() { int n,k; int i,j,p,counts=0; cin>>n>>k; for(i=1;i<=n;i++){ cin>>a[i]; } sort(a+1,a+n+1); for(i=1;i<=n;i++){ for(j=n-i+1;j>=1;j--){ if(counts==k) break; cout<<i<<‘ ‘; for(p=n;p>n-i+1;p--){ cout<<a[p]<<" "; } cout<<a[j]<<endl; counts++; } } return 0; }
题意:有一个橘子,共有n*k瓣,编号从1到n*k,有k个人 每个人都有一个想要的编号,
每个人都分到n瓣橘子,输出每个人的分配情况
#include<iostream> #include<cstdio> #include<string> using namespace std; int a[1000],b[1000]; int main(){ int n,k,counts=1; int i,j; cin>>n>>k; for(i=1;i<=k;i++){ cin>>a[i]; b[a[i]]=1; } for(i=1;i<=k;i++){ cout<<a[i]; for(j=1;j<n;j++){ while(b[counts]==1){ counts++; } cout<<" "<<counts; b[counts]=1; } cout<<endl; } return 0; }
题意:给一个数n,求小于n但是每个数不能出现超过两个得相同数字。
输出有多少种
这个是我的超时做法(我觉得应该也是对的吧)
#include<iostream> #include<cstdio> #include<cmath> #include<set> using namespace std; set<int>a; int main(){ int n,i,j,counts=0; cin>>n; if(n<=101){ cout<<n<<endl; return 0; }else{ for(i=102;i<=n;i++){ j=i; while(j){ a.insert(j%10); j=j/10; } if(a.size()==2||a.size()==1){ counts++; } a.clear(); } cout<<counts+101<<endl; } return 0; }
这个是看了别人的以后做的
#include<iostream> #include<cstdio> #include<cstring> #include<set> using namespace std; typedef long long ll; set<ll>s; ll n; void dfs(int a,int b,ll c){ s.insert(c); ll x=10*c+a; ll y=10*c+b; if(x&&x<=n){ dfs(a,b,x); } if(y&&y<=n){ dfs(a,b,y); } } int main(){ int i,j; cin>>n; for(i=0;i<=9;i++){ for(j=0;j<=9;j++){ dfs(i,j,0); } } cout<<s.size()-1<<endl; return 0; }
原文:https://www.cnblogs.com/yy0826/p/12766507.html