标签:
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3844
第一个,n个数,每次操作最大数和最小数都变成他们的差值,最后n个数相同时输出此时的值,暴力跑。
1 #include<cstdio> 2 int main(){ 3 int t,n,a[16]; 4 while(~scanf("%d",&t)){ 5 while(t--){ 6 scanf("%d",&n); 7 for(int i=0;i<n;i++){ 8 scanf("%d",&a[i]); 9 } 10 while(true){ 11 int bid=0,sid=0; 12 for(int i=1;i<n;i++){ 13 if(a[bid]<a[i]) bid=i; 14 if(a[sid]>a[i]) sid=i; 15 } 16 if(a[bid]==a[sid]){ 17 printf("%d\n",a[sid]); 18 break; 19 } 20 a[bid]=a[sid]=a[bid]-a[sid]; 21 } 22 } 23 } 24 return 0; 25 }
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5440
第二个,n个数,每次操作可以任意选两个数把他们变成他们gcd的值。最后问几步能都变成1,且输出每步选的数的下标。方法:先求出n个数的gcd,如果不为1,输出-1.否则一定能变成全1.变的方法是,先用第一个依次和后面的操作,直至第一个数变成1,然后再用第一个数把剩下的非1的都变掉。
1 #include<cstdio> 2 #include<vector> 3 using namespace std; 4 const int M=1e5+10; 5 typedef pair<int,int> pii; 6 int a[M]; 7 int gcd(int a,int b){ 8 return b?gcd(b,a%b):a; 9 } 10 vector<pii> ans; 11 int main(){ 12 int n; 13 int cas=1; 14 while(~scanf("%d",&n)){ 15 for(int i=1;i<=n;i++){ 16 scanf("%d",&a[i]); 17 } 18 int now=a[1]; 19 for(int i=2;i<=n;i++){ 20 now=gcd(now,a[i]); 21 } 22 printf("Case %d: ",cas++); 23 if(now>1){ 24 puts("-1"); 25 puts(""); 26 continue; 27 } 28 ans.clear(); 29 for(int i=2;i<=n;i++){ 30 int now=gcd(a[1],a[i]); 31 a[1]=a[i]=now; 32 ans.push_back(make_pair(1,i)); 33 if(now==1) break; 34 } 35 for(int i=2;i<=n;i++){ 36 if(a[i]==1) continue; 37 ans.push_back(make_pair(1,i)); 38 } 39 int len=ans.size(); 40 printf("%d\n",len); 41 for(int i=0;i<len;i++){ 42 printf("%d %d\n",ans[i].first,ans[i].second); 43 } 44 puts(""); 45 } 46 return 0; 47 }
end
matrix_2015_1 138 - ZOJ Monthly, January 2015
标签:
原文地址:http://www.cnblogs.com/gaolzzxin/p/4217278.html