• 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
    ",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
    ",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
    ",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
    ",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
    ",prime[i]+n,prime[i]);
    40         else puts("FAIL");
    41     }
    42     return 0;
    43 }
    View Code


     

  • 相关阅读:
    监控代码运行时长 -- StopWatch用法例程
    验证码处理算法(一)
    Linux下安装JDK及相关配置
    JAVA爬虫---验证码识别技术(一)
    JAVA4大线程池
    海量数据去重(上亿数据去重)
    python协程与异步协程
    解决WinSCP连接虚拟机
    生产消费者模式与python+redis实例运用(中级篇)
    生产消费者模式与python+redis实例运用(基础篇)
  • 原文地址:https://www.cnblogs.com/xin-hua/p/3308650.html
Copyright © 2020-2023  润新知