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

 

 

 

 


 

 

你可能感兴趣的:(online)