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 }
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 }
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 }
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 }
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 }