T1T1

考试错误:无。

思路:

直接模拟输出,只要注意多加几个特判即可。

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
int a[150];
signed main(){
	freopen("poly.in","r",stdin);
	freopen("poly.out","w",stdout);
    int n;
    cin >> n;
    for(int i=n;i>=0;i--){
        cin >> a[i];
    }for(int i=n;i>=0;i--){
        if(a[i]==0) continue;
        else if(a[i]<0) cout << "-";
        else if(i!=n) cout << "+";
        a[i]=abs(a[i]);
        if(a[i]!=1||i==0) cout << a[i];
        if(i!=0&&i!=1) cout << "x^" << i;
        if(i==1) cout << "x";
    }
}

T2T2

考试错误:没有考虑到22个密文对应一个明文的情况,导致得了9090分。

思路:

一道大模拟,直接按题目意思来即可。

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
int mm[26];
signed main(){
	freopen("spy.in","r",stdin);
	freopen("spy.out","w",stdout);
    memset(mm,-1,sizeof mm);
    string a1,a2;
    string m;
    cin >> a2 >> a1 >> m;
    for(int i=0;i<a1.size();i++){
    	if(mm[a2[i]-'A']!=-1&&mm[a2[i]-'A']!=a1[i]-'A'){
    		cout << "Failed";
    		return 0;
		}
        else{
        	mm[a2[i]-'A']=a1[i]-'A';
		} 
    }
    string f,jk;
    for(int i=0;i<=25;i++){
    	if(mm[i]==-1||jk.find(mm[i]+'A')!=-1){
    		cout << "Failed";
    		return 0;
		}jk.push_back(mm[i]+'A');
	}
    for(int i=0;i<m.size();i++){
        f=f+char(mm[m[i]-'A']+'A');
    }
    cout << f;
}

T3T3

考试错误:没做。

思路:

首先将m1m1质因数分解,再讲每个质因数的个数乘以m2m2,最后判断每个输的约数够不够,求一个max\max即可。

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
pair<int,int> m[30050];
int m1,m2,_size;
int a[10050];
void divide(int n){
	for(int i=2;i<=n/i;i++){
		if(n%i==0){
			int cnt=0;
	        m[++_size].first=i;
			while(n%i==0){
				n/=i;
				cnt++;
			}
	        m[_size].second=cnt*m2;
		}
	}
    if(n>1){
        m[++_size].first=n;
        m[_size].second=m2;
    }
}
int solve(int f){
    int res=0;
    for(int i=1;i<=_size;i++){
        if(f%m[i].first!=0) return -1;
        int cnt=0;
        int ff=f;
        while(ff%m[i].first==0){
            ff/=m[i].first;
            cnt++;
        }
        res=max(res,(m[i].second+cnt-1)/cnt);
    }
    return res;
}
signed main(){
    freopen("cell.in","r",stdin);
    freopen("cell.out","w",stdout);
    int n;
    cin >> n >> m1 >> m2;
    divide(m1);
    int Min=0xffffffff;
    for(int i=1;i<=n;i++){
        cin >> a[i];
        int x=solve(a[i]);
        if(x!=-1) Min=min(Min,x);
    }
    if(Min==0xffffffff){
       cout << -1;
       return 0; 
    }
    cout << Min;
    return 0;
}

T4T4

考试错误:还是没做。

思路:

DPDP

初始化:f0=0,fi=2e9f_0=0,f_i=2e9

状态转移方程:fi=max(fi,fik+sumcost(jk+n)modn)f_i=\max(f_i,f_{i-k}+sum-cost_{(j-k+n)\mod n})(sumsum表示机器人拾取到的金币数量,costicost_i表示第ii个机器人的价格);

输出:fmf_m

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1010;
int a[N][N],f[N],cost[N];
signed main(){
	freopen("game.in","r",stdin);
	freopen("game.out","w",stdout);
    int n,m,p;
    cin >> n >> m >> p;
    memset(f,-2e9,sizeof f);
    f[0]=0;
    for(int i=1;i<=n;i++){
    	for(int j=1;j<=m;j++){
    		cin >> a[i][j];
		}
	}for(int i=1;i<=n;i++){
		cin >> cost[i];
	}
	int sum=0;
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			sum=0;
			for(int k=1;k<=min(p,i);k++){
				int last;
				if(j-k<=0) last=(j-k)%n+n;
				else last=j-k;
				sum+=a[last][i-k+1];
				f[i]=max(f[i-k]+sum-cost[last],f[i]);
			}
		}
	}
	cout << f[m];
}