第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛部分题解


太菜补题中
题解:
number1:跳台阶

 
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int m;
    while(n--){
        cin>>m;
        int t=1;
        for(int i=1;i<m;i++){
            t*=2;
        }
        cout<<t<<endl;
    }
    return 0;
}
number3:平分游戏
 
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const int maxn=1e6+10;
typedef long long ll;
int n,k;
ll a[maxn];
ll c[maxn],b[maxn];
bool vis[maxn];
ll solve(int n,int k)
{
    ll ret=0;
    ll sum=0;
    for (int i=0;i<n;i++) sum+=a[i];
    if (sum%n!=0) return -1;
    ll aver=sum/n;
    if (k>=n)
    {
        for (int i=0;i<n;i++)
            if (a[i]!=aver) return -1;
        return 0;
    }
    for (int i=0;i<n;i++)
    if (!vis[i])
    {
        vis[i]=1;
        ll tote=a[i];
        int m=0; b[m++]=a[i];
        int j=(i+k)%n;
        while(!vis[j])
        {
            vis[j]=1;
            b[m++]=a[j];
            tote+=a[j];
            j=(j+k)%n;
        }
        if (tote%m!=0) return -1;
        ll ans=tote/m;
        if (ans!=aver) return -1;
        c[0]=b[0]-ans;
        for (int i=1;i<m;i++)
            c[i]=c[i-1]+b[i]-aver;
        nth_element(c,c+m/2,c+m);
        ll mid=c[m/2];
        for (int i=0;i<m;i++)
            ret+=abs(c[i]-mid);
    }
    return ret;
}
int main()
{
    scanf("%d%d",&n,&k);
    for (int i=0;i<n;i++) scanf("%lld",&a[i]);
    ll ans=solve(n,k+1);
    /*for(int i=0;i<n;i++){
        printf("%d ",b[i]);
    }
    printf("\n");
    for(int i=0;i<n;i++){
        printf("%d ",c[i]);
    }
    printf("\n");*/
    if (ans!=-1) printf("%lld\n",ans);
    else printf("gg\n");
}
number9:填数字
 
#include<iostream>
using namespace std;
int main()
{
    cout<<"a"<<"c"<<endl;
    return 0;
}
number4:pas面试
 
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char s[1250];
int dp[1250];
int Max(const int &a,const int &b)
{
    return a>b?a:b;
}
int main()
{
    while(~scanf("%s",s)){
        int len=strlen(s);
        int ans=0;
        for (int i=0;i<len;++i)
        {
            dp[i]=1;
            if (s[i]>='A'&&s[i]<='Z')
                s[i]='a'+s[i]-'A';
        }
        for (int i=len-1;i>=0;--i)
        {
            int res=0;
            for (int j=i+1;j<len;++j)
            {
                int tmp=dp[j];
                printf("tmp==%d\n",tmp); 
                if (s[i]==s[j]){
                    dp[j]=res+2;
                    printf("j==%d %d\n",j,dp[j]);
                }
                res=Max(res,tmp);
                printf("res==%d\n",res);
            }
            printf("\n");
        }
        for(int i=0;i<len;i++){
            printf("%d ",dp[i]);
        }
        printf("\n");
        for (int i=0;i<len;++i)
            ans=Max(ans,dp[i]);
        printf("%d\n",len-ans);
    }
    return 0;
}
 
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=2000;
int dp[maxn][maxn];
int lps(char*str,int n)
{
    memset(dp,0,sizeof(dp));
    for(int i=0;i<n;i++) dp[i][i]=1;
    for(int i=1;i<n;i++){
        int tmp=0;
        for(int j=0;j+i<n;j++){
            if(str[j]==str[j+i])
                tmp=dp[j+1][j+i-1]+2;
            else 
                tmp=max(dp[j+1][j+i],dp[j][j+i-1]);
            dp[j][j+i]=tmp;
        }
    }
    return dp[0][n-1];
}
int main()
{
    char str[maxn];
    while(scanf("%s",str)!=EOF)
    {
        int len=strlen(str);
        for (int i=0;i<len;++i){
            if (str[i]>='A'&&str[i]<='Z')
                str[i]='a'+str[i]-'A';
        }
        
        int res=lps(str,len);
        printf("%d\n",len-res);
    }   
    
    return 0;
}
number F 
思路:
1/x+1/y=1/n,设x=n+a,y=n+b,化简可得n^2=a*b,
找出n^2的所有因子,根据数论中的唯一分解定理可得
任何整数n都可以表示为 n = p1^e1*p2^e2*..pn^en,
其中p1,p2…,pn都为素数,并且n的约数个数为(1+e1)*(1+e2)*…(1+en),
所以n^2 = (p1^e1*p2^e2…pn^en)^2 = (p1^2e1)*(p2^2e2)…*(pn^2en),所以因子个数为(1+2e1)*(1+2e2)*…(1+2en),所以可以利用唯一分解定理求出e1 e2…en,由于要满足x <= y所以只需找出a <= b的解的个数即可,设因子乘积为res,x<=y,所以res/2+1。

 
#include <bits/stdc++.h>  
using namespace std;  
const int N = 1005;  
typedef long long ll;  
  
int num[N];  
int main()  
{  
    int t;  
    cin>>t;  
    while(t--){  
        int n,cnt=0;  
        memset(num,0,sizeof(num));  
        cin>>n;  
        for(int i=2;i*i<=n;++i){  
            if(n%i==0){  
                while(n%i==0){  
                    num[cnt]++;  
                    n/=i;  
                }  
                cnt++;  
            }  
        }  
        if(n!=1){  
            num[cnt]++;  
            cnt++;  
        }  
        int res=1;  
        for(int i=0;i<cnt;++i)  
            res=res*(num[i]*2+1);  
        printf("%d\n",res/2+1);  
    }  
}  
number回旋星空:求等腰三角形的个数:使用去重函数unique(),
注意:使用unique函数去前先排序
 
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=1000+10;
int t,n;
int a[maxn],b[maxn];
int c[maxn*maxn];
int main()
{
    cin>>t;
    while(t--){
        cin>>n;
        for(int i=0;i<n;i++){
            cin>>a[i]>>b[i];
        }
        int res=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                c[j]=(a[i]-a[j])*(a[i]-a[j])+(b[i]-b[j])*(b[i]-b[j]);
            }
            sort(c,c+n);
            int ans=unique(c,c+n)-c;
            res+=n-ans; 
        }
        if(res==0){
            cout<<"WA"<<endl;
        }else{
            cout<<res*2<<endl;
        }
    }
    return 0;
}
 
number回旋矩阵
 
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int t;
int n,m;
char a[30][30];
char b[30][30];
char c[30][30];
char d[30][30];
string s;
void zhuan90()
{
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            b[m-j-1][i]=a[i][j];
        }
    }
    
}
void zhuan180()
{
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            c[n-i-1][m-j-1]=a[i][j];
        }
    }
}
void zhuan270()
{
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            d[m-j-1][i]=c[i][j];
        }
    }
} 
int main()
{
    cin>>t;
    while(t--){
        cin>>n>>m;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                cin>>a[i][j];
            }
        }
        zhuan90();
        zhuan180();
        zhuan270();
        cin>>s;
        int len=s.length();
        int ls=0;
        for(int i=0;i<len;i++){
            if(s[i]=='L')ls=(ls+1)%4;
            else ls=(ls+3)%4;
        }
        if(ls==0){
            cout<<n<<" "<<m<<endl;
            for(int i=0;i<n;i++){
                for(int j=0;j<m;j++){
                    cout<<a[i][j];
                }
                cout<<endl;
            }
        }else if(ls==1){
                cout<<m<<" "<<n<<endl;
                for(int i=0;i<m;i++){
                    for(int j=0;j<n;j++){
                        if(b[i][j]=='|'){
                            cout<<"-";
                        }else if(b[i][j]=='-'){
                            cout<<"|";
                        }else cout<<b[i][j];
                    }
                    cout<<endl;
                }
            }else if(ls==2){
                cout<<n<<" "<<m<<endl;
                for(int i=0;i<n;i++){
                    for(int j=0;j<m;j++){
                        cout<<c[i][j];
                    }
                    cout<<endl;
                }
            }else if(ls==3){
                cout<<m<<" "<<n<<endl;
                for(int i=0;i<m;i++){
                    for(int j=0;j<n;j++){
                        if(d[i][j]=='|'){
                            cout<<"-";
                        }else if(d[i][j]=='-'){
                            cout<<"|";
                        }else cout<<d[i][j];
                    }
                    cout<<endl;
                }
            }
            cout<<endl;
        }
    return  0;
}
ac2
 
#include <bits/stdc++.h>
#define pb push_back
#define fi first
#define se second
#define IOS ios_base::sync_with_stdio(false); cin.tie(0);
using namespace std;
typedef unsigned long long ull;
typedef long long LL;
typedef pair<int, int> pii;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3fLL;
 
int n, m;
char s[35][35], op[1005];
 
int main() {
    int T; scanf("%d", &T);
    while (T--) {
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= n; ++i) scanf("%s", s[i] + 1);
        scanf("%s", op);
        int cur = 0;
        for (int i = 0; op[i]; ++i) {
            if (op[i] == 'L') {
                cur = (cur + 1) % 4;
            } else {
                cur = (cur + 3) % 4;
            }
        }
        if (cur == 0) {
            printf("%d %d\n", n, m);
            for (int i = 1; i <= n; ++i) {
                for (int j = 1; j <= m; ++j) printf("%c", s[i][j]);
                puts("");
            }
        } else if (cur == 1) {
            printf("%d %d\n", m, n);
            for (int j = m; j >= 1; --j) {
                for (int i = 1; i <= n; ++i) {
                    if (s[i][j] == '|') s[i][j] = '-';
                    else if (s[i][j] == '-') s[i][j] = '|';
                    printf("%c", s[i][j]);
                }
                puts("");
            }
        } else if (cur == 2) {
            printf("%d %d\n", n, m);
            for (int i = n; i >= 1; --i) {
                for (int j = m; j >= 1; --j) printf("%c", s[i][j]);
                puts("");
            }
        } else {
            printf("%d %d\n", m, n);
            for (int j = 1; j <= m; ++j) {
                for (int i = n; i >= 1; --i) {
                    if (s[i][j] == '|') s[i][j] = '-';
                    else if (s[i][j] == '-') s[i][j] = '|';
                    printf("%c", s[i][j]);
                }
                puts("");
            }
        }
        puts("");
    }
    return 0;
}
number 强迫症序列
:暴力超时
 
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e6+10;
int t;
int n;
int a[maxn];
int main()
{
    cin>>t;
    while(t--){
        cin>>n;
        for(int i=0;i<n;i++){
            cin>>a[i];
        }
        int ans;
        sort(a,a+n);
        ans=unique(a,a+n)-a;
        int k=0;
        if(ans==1)cout<<k<<" "<<a[0]<<endl;
        else{
            int flag;
            while(1){
                flag=0;
                sort(a,a+n);
                for(int i=0;i<n-1;i++){
                    a[i]+=1;
                }
                /*for(int i=0;i<n;i++){
                    cout<<a[i]<<" ";
                }
                cout<<endl;*/
                for(int i=0;i<n-1;i++){
                    if(a[i]==a[i+1]){
                        flag++;
                    }
                }
                //cout<<"flag=="<<flag<<endl;
                k++;
                if(flag==n-1){
                    break;
                }
                
            }
            if(flag==n-1)
            cout<<k<<" "<<a[0]<<endl;
        }
    }
    
    return 0;
}
ac代码:
 
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=1e6+10;
typedef long long ll;
int t;
int n;
ll a[maxn]; 
int main()
{
    ios::sync_with_stdio(false);
    cin>>t;
    while(t--){
        cin>>n;
        ll sum=0;
        ll minn=1e9;
        for(int i=0;i<n;i++){
            cin>>a[i];
            sum+=a[i];
            minn=min(minn,a[i]);
        }
        ll num=sum-n*minn;
        cout<<num<<" "<<(sum+num*(n-1))/n<<endl;
    }
}
ac使用dp
 
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e6+100;
typedef long long ll;
int t;
int n;
ll a[maxn];
ll d;
ll ans;
int main()
{
    ios::sync_with_stdio(false);
    cin>>t;
    while(t--){
        cin>>n;
        for(int i=0;i<n;i++){
            cin>>a[i];
        }
        sort(a,a+n);
        d=0;
        ans=a[0];
        ll tmp;
        for(int i=1;i<n;i++){
            tmp=d;
        //  cout<<"tmp=="<<tmp<<endl; 
            d=d*2+a[i]-ans;
        //  cout<<"d=="<<d<<endl;
            ans=tmp+a[i];
        //  cout<<"ans=="<<ans<<endl;
        }
        cout<<d<<" "<<ans<<endl;
    }
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/ab1605014317/article/details/80283747