2013 ACM/ICPC Asia Regional Online —— Warmup

1003 Rotation Lock Puzzle

找出每一圈中的最大值即可

代码如下:

 

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<algorithm>
 4 #include<iomanip>
 5 #include<cmath>
 6 #include<cstring>
 7 #include<vector>
 8 #define ll __int64
 9 #define pi acos(-1.0)
10 #define MAX 50000
11 using namespace std;
12 ll a[10][10],b[10];
13 vector<ll>q;
14 int main(){
15     int i,j,k,m,n;
16     while(scanf("%d",&n)&&n){
17         for(i=1;i<=n;i++)
18             for(j=1;j<=n;j++)
19                 scanf("%I64d",&a[i][j]);
20         ll ans=a[n/2+1][n/2+1];
21         int num=0;
22         m=n-1;
23         for(k=1;k<=n/2;k++){
24             memset(b,0,sizeof(b));
25             q.clear();
26             for(i=j=k;j<=n-k+1;j++)
27                 q.push_back(a[i][j]);
28             for(j--,i++;i<=n-k+1;i++)
29                 q.push_back(a[i][j]);
30             for(i--,j--;j>=k;j--)
31                 q.push_back(a[i][j]);
32             for(i--,j++;i>k;i--)
33                 q.push_back(a[i][j]);
34             for(i=0;i<q.size();i++){
35                 b[i%m]+=q[i];
36             }
37             ll sum=-99999999999999;
38             int num1=0;
39             for(i=0;i<m;i++){
40                 if(b[i]>sum){
41                     sum=b[i];
42                     if(m-i<i) num1=m-i;
43                     else num1=i;
44                 }
45                 if(b[i]==sum){
46                     if(m-i<num1) num1=m-i;
47                     else if(i<num1) num1=i;
48                 }
49             }
50             ans+=sum;
51             num+=num1;
52             m-=2;
53         }
54         printf("%I64d %d\n",ans,num);
55     }
56     return 0;
57 }
View Code

1005 Balls Rearrangement

多校联合的原题

代码如下:

 

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<algorithm>
 4 #include<iomanip>
 5 #include<cmath>
 6 #include<cstring>
 7 #include<vector>
 8 #include<stdlib.h>
 9 #define ll __int64
10 using namespace std;
11 ll gcd(ll a,ll b){
12     ll t;
13     if(a<b) swap(a,b);
14     while(b){
15         t=a;
16         a=b;
17         b=t%b;
18     }
19     return a;
20 }
21 ll lcm(ll a,ll b){
22     return a/gcd(a,b)*b;
23 }
24 ll cal(ll n,ll a,ll b){
25     ll ans=0;
26     ll temp=0;
27     ll x=0,y=0,i=0;
28     while (i<n){
29         temp = min(a-x,b-y);
30         if (i+temp>n) temp=n-i;
31         ans += temp*abs(x-y);
32         x = (x+temp)%a;
33         y = (y+temp)%b;
34         i += temp;
35     }
36     return ans;
37 }
38 int main(){
39     int t;
40     ll n,a,b,c,ans;
41     cin>>t;
42     while (t--){
43         scanf("%I64d%I64d%I64d",&n,&a,&b);
44         if(a==b){
45             cout<<0<<endl;
46             continue;
47         }
48         c=lcm(a,b);
49         if (c>=n) ans = cal(n,a,b);
50         else ans = cal(c,a,b)*(n/c)+cal(n%c,a,b);
51         printf("%I64d\n",ans);
52     }
53     return 0;
54 }
View Code

 

1007 Hamming Distance

 

随机选取2个点即可,坑……

 

代码如下:

 

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<algorithm>
 4 #include<iomanip>
 5 #include<cmath>
 6 #include<cstring>
 7 #include<vector>
 8 #define ll __int64
 9 #define pi acos(-1.0)
10 #define MAX 50000
11 using namespace std;
12 char str[100005][6];
13 int fun(char a)
14 {
15     if(a>='A'&&a<='Z') return a-'A'+10;
16     return a-'0';
17 }
18 int cal(char a[],char b[])
19 {
20     int num=0;
21     for(int i=0;i<5;i++){
22         int s=fun(a[i]);
23         int p=fun(b[i]);
24         for(int j=0;j<4;j++){
25             num+=(s%2!=p%2);
26             s/=2;
27             p/=2;
28         }
29     }
30     return num;
31 }
32 int main(){
33     int t,i,j,k,n;
34     scanf("%d",&t);
35     while(t--){
36         scanf("%d",&n);
37         for(i=0;i<n;i++){
38             scanf("%s",&str[i]);
39         }
40         int num=999;
41         for(i=1;i<=100000;i++){
42             j=rand()%n;
43             k=rand()%n;
44             while(j==k) k=rand()%n;
45             int a=cal(str[j],str[k]);
46             if(a<num) num=a;
47         }
48         printf("%d\n",num);
49     }
50     return 0;
51 }
View Code

 

1008 Permutation

这题和hdu 3092一样,只不过这题要求路径。

大致思路用筛法求质数,当尽可能是质数时LCM最大,转化为背包问题求。

代码如下:

 

 1 #include<cstdio>
 2 #include<vector>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<cmath>
 7 #define M 10005
 8 using namespace std;
 9 double dp[M];
10 vector<int> p[M];
11 int prime[M],cnt,n;
12 bool f[M];
13 void init()
14 {
15     cnt=0;
16     for(int i=2;i<M;i++){
17         if(!f[i]) prime[cnt++]=i;
18         for(int j=0;j<cnt&&i*prime[j]<M;j++){
19             f[i*prime[j]]=1;
20             if(i%prime[j]==0) break;
21         }
22     }
23 }
24 void solve()
25 {
26     memset(dp,0,sizeof(dp));
27     for(int i=0;i<=n;i++) p[i].clear();
28     for(int i=0;i<cnt&&prime[i]<=n;i++){
29         double t=log(prime[i]);
30         for(int j=n;j>=prime[i];j--){
31             for(int k=prime[i],num=1;k<=j;k*=prime[i],num++)
32             if(dp[j-k]+t*num>dp[j]){
33                 dp[j]=dp[j-k]+t*num;
34                 p[j]=p[j-k];
35                 p[j].push_back(k);
36             }
37         }
38     }
39 }
40 int main()
41 {
42     int t,sum;
43     init();
44     scanf("%d",&t);
45     while(t--){
46         scanf("%d",&n);
47         solve();
48         sum=0;
49         for(int i=0;i<p[n].size();i++) sum+=p[n][i];
50         sum=n-sum;
51         while(sum--) p[n].push_back(1);
52         int s=1;
53         sort(p[n].begin(),p[n].end());
54         for(int i=0;i<p[n].size();i++){
55             int temp=s++;
56             for(int j=1;j<p[n][i];j++)
57                 printf("%d ",s++);
58             if(i==p[n].size()-1) printf("%d\n",temp);
59             else printf("%d ",temp);
60         }
61     }
62     return 0;
63 }
View Code

 

 

1010 Difference Between Primes

注意细节就可以了

代码如下:

 

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<algorithm>
 4 #include<iomanip>
 5 #include<cmath>
 6 #include<cstring>
 7 #include<vector>
 8 #define ll __int64
 9 #define pi acos(-1.0)
10 #define MAX 50000
11 using namespace std;
12 bool f[10000005];
13 int prime[10000005],cnt;
14 void init()
15 {
16     cnt=0;
17     f[1]=1;
18     for(int i=2;i<=10000000;i++){
19         if(f[i]==0) prime[cnt++]=i;
20         for(int j=0;j<cnt&&i*prime[j]<=10000000;j++){
21             f[i*prime[j]]=1;
22             if(i%prime[j]==0) break;
23         }
24     }
25 }
26 int main(){
27     init();
28     int i,t,n;
29     scanf("%d",&t);
30     while(t--){
31         scanf("%d",&n);
32         bool flag=0;
33         for(i=0;i<cnt;i++){
34             if(prime[i]+n>0&&f[prime[i]+n]==0){
35                 flag=1;
36                 break;
37             }
38         }
39         if(flag) printf("%d %d\n",prime[i]+n,prime[i]);
40         else puts("FAIL");
41     }
42     return 0;
43 }
View Code

 

 

 

 


 

 

posted @ 2013-09-08 19:05  _随心所欲_  阅读(351)  评论(0编辑  收藏  举报