You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
544 lines
11 KiB
544 lines
11 KiB
实验1.1半数集问题
|
|
#include <bits/stdc++.h>
|
|
using namespace std;
|
|
int a[1005]={0}; //存放已计算的数据
|
|
int b[1005]={0};
|
|
int halfset(int n){
|
|
int sum = 1;
|
|
if(a[n]>0) //如果f(n)已经得出,就不必再重复计算
|
|
return a[n];
|
|
for(int i=1;i<=n/2;i++){
|
|
sum += halfset(i);
|
|
}
|
|
a[n]=sum;
|
|
return sum;
|
|
}
|
|
int main()
|
|
{
|
|
int n = 0,i = 0;
|
|
cin>>n;
|
|
while(n!=0){
|
|
b[i++] = n;
|
|
cin>>n;
|
|
}
|
|
for(int j=0;j<i;j++){
|
|
int result=halfset(b[j]);
|
|
cout << result <<endl;
|
|
}
|
|
return 0;
|
|
}
|
|
实验1.2双色hanoi塔问题
|
|
#include <bits/stdc++.h>
|
|
#include<cstdio>
|
|
#include<cstring>
|
|
void mov(int n,char a,char b)
|
|
{
|
|
printf("%d %c %c\n",n,a,b);
|
|
}
|
|
void dg(int n,char a, char c, char b)
|
|
{
|
|
if(n==1) mov(n,a,b);
|
|
else
|
|
{
|
|
dg(n-1,a,b,c);
|
|
mov(n,a,b);
|
|
dg(n-1,c,a,b);
|
|
}
|
|
}
|
|
int main()
|
|
{
|
|
char a='A',b='B',c='C';
|
|
int n;
|
|
while(scanf("%d",&n)!=EOF)
|
|
dg(n,a,c,b);
|
|
return 0;
|
|
}
|
|
实验1.3 整数因子分解问题
|
|
#include <bits/stdc++.h>
|
|
using namespace std;
|
|
map<int ,int >a;
|
|
int f(int n){
|
|
if(n == 1)
|
|
return 1;
|
|
if(a[n])
|
|
return a[n];
|
|
int count=1;
|
|
for(int i=2;i<=sqrt(n);i++){
|
|
if(n%i == 0){
|
|
count+=f(i);
|
|
if(i!=n/i){
|
|
count+=f(n/i);
|
|
}
|
|
}
|
|
}
|
|
a[n] = count;
|
|
return a[n];
|
|
}
|
|
int main()
|
|
{
|
|
int n;
|
|
while(cin>>n){
|
|
cout<<f(n)<<endl;
|
|
}
|
|
}
|
|
|
|
|
|
实验2.1我要去西藏
|
|
#include<bits/stdc++.h>
|
|
#include<algorithm>
|
|
using namespace std;
|
|
int a[200][200];
|
|
int cost[200];
|
|
int city,result;
|
|
int travel(){
|
|
cost[city-2] = a[city-2][city-1];
|
|
for(int i = city-3;i>=0;i--){
|
|
result = a[i][city-1];
|
|
for(int j = i+1;j<city-1;j++){
|
|
result = min(a[i][j]+cost[j],result);
|
|
}
|
|
cost[i] = result;
|
|
}
|
|
return cost[0];
|
|
}
|
|
int main(){
|
|
cin>>city;
|
|
for(int i = 0;i<city-1;i++){
|
|
for(int j = i+1;j<city;j++){
|
|
cin>>a[i][j];
|
|
}
|
|
}
|
|
result = travel();
|
|
cout<<result;
|
|
return 0;
|
|
}
|
|
实验2.2云天明项链
|
|
#include <bits/stdc++.h>
|
|
using namespace std;
|
|
const int N = 1e3 + 10;
|
|
#define Ma_x 99999
|
|
#define Mi_x 0
|
|
#define min(a,b) a<b?a:b
|
|
#define max(a,b) a>b?a:b
|
|
int n,w[N],dp[N][N],dq[N][N];
|
|
int sum(int i,int t){
|
|
int k,s=0,k1;
|
|
for(k=i;k<i+t;k++){
|
|
k1=k%n;
|
|
if(k1==0) k1=n;
|
|
s=s+w[k1];
|
|
}
|
|
return s;
|
|
}
|
|
int main(){
|
|
int i,t,k;
|
|
scanf("%d",&n);
|
|
for(i=1;i<=n;i++){
|
|
scanf("%d",&w[i]);
|
|
dp[i][1]=0;
|
|
}
|
|
for(t=2;t<=n;t++){
|
|
for(i=1;i<=n;i++){
|
|
dp[i][t]=Ma_x;
|
|
dq[i][t]=Mi_x;
|
|
for(k=1;k<t;k++){
|
|
dp[i][t]=min(dp[i][t],dp[i][k]+dp[(i+k-1)%n+1][t-k]+sum(i,t)); dq[i][t]=max(dq[i][t],dq[i][k]+dq[(i+k-1)%n+1][t-k]+sum(i,t));
|
|
}
|
|
}
|
|
}
|
|
int mini=Ma_x;
|
|
int maxi=Mi_x;
|
|
for(i=1;i<=n;i++){
|
|
mini=min(mini,dp[i][n]);
|
|
maxi=max(maxi,dq[i][n]);
|
|
}
|
|
printf("%d\n",mini);
|
|
printf("%d ",maxi);
|
|
}
|
|
实验2.3扩展距离
|
|
#include <bits/stdc++.h>
|
|
#include<algorithm>
|
|
using namespace std;
|
|
string a,b;
|
|
int k;
|
|
int value[10000][10000];
|
|
int main(){
|
|
cin>>a>>b>>k;
|
|
int alen=a.size();
|
|
int blen=b.size();
|
|
for(int i=0;i<=alen;i++){
|
|
value[i][0]=k*i;
|
|
}
|
|
for(int i=1;i<=blen;i++){
|
|
value[0][i]=k*i;
|
|
}
|
|
for(int i=1;i<=alen;i++){
|
|
for(int j=1;j<=blen;j++){
|
|
value[i][j]=min(min(value[i-1][j]+k,value[i][j-1]+k),value[i-1][j-1]+abs(a[i-1]-b[j-1]));
|
|
}
|
|
}
|
|
cout<<value[alen][blen];
|
|
}
|
|
实验2.4双胞胎探宝
|
|
#include<bits/stdc++.h>
|
|
#include<iostream>
|
|
using namespace std;
|
|
int n;
|
|
int m[15][15];
|
|
int f[25][15][15];
|
|
int main() {
|
|
cin >> n;
|
|
int x, y, z;
|
|
while (cin >> x >> y >> z) {
|
|
if (!x && !y && !z) break;
|
|
m[x][y] = z;
|
|
}
|
|
for (int k = 2; k <= 2 * n; k ++ )
|
|
for (int i = 1; i <= n; i ++ )
|
|
for (int j = 1; j <= n; j ++ ) {
|
|
int a = k - i, b = k - j;
|
|
if (a >= 1 && a <= n && b >= 1 && b <= n) {
|
|
int t = max(max(f[k - 1][i - 1][j], f[k - 1][i][j]), max(f[k - 1][i][j - 1], f[k - 1][i - 1][j - 1]));
|
|
if (i == j) f[k][i][j] = t + m[i][a];
|
|
else f[k][i][j] = t + m[i][a] + m[j][b];
|
|
}
|
|
}
|
|
cout << f[2 * n][n][n];
|
|
return 0;
|
|
}
|
|
实验2.5双胞胎做题
|
|
#include <bits/stdc++.h>
|
|
using namespace std;
|
|
int f[1000][1000];
|
|
int a[10000],b[10000];
|
|
int n,sum,result=9999;
|
|
|
|
void resulta(){
|
|
memset(f, 0, sizeof(f));
|
|
for(int i=1;i<=n;i++){
|
|
|
|
for(int j=0;j<=sum;j++){
|
|
if(j<a[i]){
|
|
f[i][j]=f[i-1][j]+b[i];
|
|
}
|
|
else{
|
|
f[i][j]=min(f[i-1][j-a[i]],f[i-1][j]+b[i]);
|
|
}
|
|
}
|
|
}
|
|
for(int j=0;j<=sum;j++)
|
|
{
|
|
int t=max(f[n][j],j);
|
|
if(result>t)
|
|
result=t;
|
|
}
|
|
}
|
|
|
|
int main(){
|
|
cin>>n;
|
|
for(int i=1;i<=n;i++){
|
|
cin>>a[i];
|
|
sum=sum+a[i];
|
|
}
|
|
for(int i=1;i<=n;i++){
|
|
cin>>b[i];
|
|
}
|
|
resulta();
|
|
cout<<result;
|
|
}
|
|
实验2.6少打比赛多训练
|
|
#include <bits/stdc++.h>
|
|
|
|
using namespace std;
|
|
typedef long long ll;
|
|
ll dp[100002],n,m,s[100002]={0};
|
|
map<ll,int>T;
|
|
struct node{
|
|
ll u;ll t;
|
|
}a[100002];
|
|
int main()
|
|
{
|
|
cin>>n>>m;
|
|
for(int i=0;i<m;i++){
|
|
scanf("%lld%lld",&a[i].u,&a[i].t);
|
|
T[a[i].u*100000+(s[a[i].u]++)]=a[i].t;//记录以a[i].u开始的每一个维持时间
|
|
}
|
|
memset(dp,0x3f,sizeof(dp));
|
|
dp[n+1]=0;
|
|
for(int i=n;i>=1;i--){
|
|
if(s[i]==0){dp[i]=dp[i+1];}
|
|
else{
|
|
for(int j=0;j<s[i];j++)
|
|
dp[i]=min(dp[i+T[i*100000+j]]+T[i*100000+j],dp[i]);
|
|
}
|
|
}
|
|
cout<<dp[1]<<endl;
|
|
return 0;
|
|
}
|
|
实验3.1教室安排问题
|
|
#include<bits/stdc++.h>
|
|
#include <iostream>
|
|
#include <algorithm>
|
|
|
|
using namespace std;
|
|
struct huichang
|
|
{
|
|
int s;
|
|
int f;
|
|
};
|
|
huichang t[10000+10];
|
|
int n;
|
|
bool cmp(huichang a, huichang b) {
|
|
return a.s < b.s;
|
|
}
|
|
int meeting() {
|
|
int count_chang = 0;
|
|
int *a = new int[n + 1]; //该数组于保存每个会场的结束时间
|
|
for (int i = 0; i < n+1; i++) {
|
|
a[i] = 0;
|
|
}
|
|
for (int i = 1; i <= n; i++) {
|
|
for (int j = 1; j <= n; j++) {
|
|
if (a[j] <= t[i].s) {
|
|
a[j] = t[i].f;
|
|
if (j >= count_chang + 1) count_chang++;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
delete[]a;
|
|
return count_chang;
|
|
}
|
|
int main() {
|
|
cin >> n;
|
|
for (int i = 1; i <= n; i++) {
|
|
cin >> t[i].s >> t[i].f;
|
|
}
|
|
sort(t+1,t+n+1,cmp);
|
|
cout << meeting() << endl;
|
|
return 0;
|
|
}
|
|
实验3.2磁带最优存储问题
|
|
#include <bits/stdc++.h>
|
|
#include<iostream>
|
|
#include<queue>
|
|
#include<fstream>
|
|
using namespace std;
|
|
struct Tape
|
|
{
|
|
int len; //长度
|
|
int pr; //概率
|
|
double tr;
|
|
friend bool operator< (Tape a,Tape b) {return a.tr>b.tr;}
|
|
Tape(int l=0,int p=0):len(l),pr(p),tr(l*p){};
|
|
};
|
|
priority_queue<Tape>tape;
|
|
double minTimeCost(int n,priority_queue<Tape>&tape,long long sum){
|
|
double res=0,acc=0;
|
|
while(!tape.empty())
|
|
{
|
|
acc+=tape.top().tr/sum;//计算tr累加值
|
|
res+=acc;
|
|
tape.pop();
|
|
}
|
|
return res;
|
|
}
|
|
int main()
|
|
{
|
|
int n,a,b;
|
|
long long sum=0;
|
|
cin>>n;
|
|
for(int i = 0;i<n;i++){
|
|
cin>>a>>b;
|
|
tape.push(Tape(a,b));
|
|
sum+=b;//计算概率和
|
|
}
|
|
double res=minTimeCost(n,tape,sum);
|
|
cout<<res;
|
|
return 0;
|
|
} }
|
|
double res=minTimeCost(n,tape,sum);
|
|
cout<<res;
|
|
return 0;
|
|
}
|
|
作业2.1烟台基地宿舍分配
|
|
#define _CRT_SECURE_NO_WARNINGS 1
|
|
#include <bits/stdc++.h>
|
|
using namespace std;
|
|
typedef long long ll;
|
|
typedef pair<int, int> PII;
|
|
const int N = 1e5 + 10;
|
|
ll n;
|
|
ll dp[110][110];
|
|
int main()
|
|
{
|
|
ios::sync_with_stdio(0);
|
|
cin.tie(0);
|
|
cin >> n;
|
|
memset(dp, 0, sizeof dp);
|
|
dp[1][1] = 1;// i个人分j个宿舍
|
|
for (int i = 0; i <= n; i++) {
|
|
dp[i][0] = 0;
|
|
dp[i][1] = 1;
|
|
dp[0][i] = 0;
|
|
}
|
|
ll sum = 0;
|
|
for (int i = 1; i <= n; i++) {
|
|
for (int j = 1; j <= i; j++) {
|
|
if(dp[i][j]==0) dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j] * j;
|
|
}
|
|
}
|
|
for (int i = 1; i <= n; i++) {
|
|
sum += dp[n][i];
|
|
}
|
|
cout << sum;
|
|
return 0; //17
|
|
}
|
|
作业2.2烟台基地宿舍分配2
|
|
#define _CRT_SECURE_NO_WARNINGS 1
|
|
#include <bits/stdc++.h>
|
|
using namespace std;
|
|
typedef long long ll;
|
|
typedef pair<int, int> PII;
|
|
const int N = 1e5 + 10;
|
|
ll n,m;
|
|
ll dp[110][110];
|
|
int main()
|
|
{
|
|
ios::sync_with_stdio(0);
|
|
cin.tie(0);
|
|
cin >> n>>m;
|
|
memset(dp, 0, sizeof dp);
|
|
dp[1][1] = 1;// i个人分j个宿舍
|
|
for (int i = 0; i <= n; i++) {
|
|
dp[i][0] = 0;
|
|
dp[i][1] = 1;
|
|
dp[0][i] = 0;
|
|
}
|
|
ll sum = 0;
|
|
for (int i = 1; i <= n; i++) {
|
|
for (int j = 1; j <= i; j++) {
|
|
if(dp[i][j]==0) dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j] * j;
|
|
}
|
|
}
|
|
cout << dp[n][m];
|
|
return 0;
|
|
}
|
|
作业3.1金字塔寻宝
|
|
#include <bits/stdc++.h>
|
|
#include<iostream>
|
|
using namespace std;
|
|
const int N=105;
|
|
int n,*num,*lastNum,ary1[N],ary2[N];
|
|
void dp()
|
|
{
|
|
num=ary1,lastNum=ary2;
|
|
for(int i=1;i<=n;i++){
|
|
for(int j=1;j<=i;j++){
|
|
cin>>num[j];
|
|
num[j]=max(lastNum[j],lastNum[j-1])+num[j];
|
|
}
|
|
swap(num,lastNum);
|
|
}
|
|
}
|
|
int maxValue()
|
|
{
|
|
int max=lastNum[1];
|
|
for(int i=2;i<=n;i++)
|
|
if(lastNum[i]>max) max=lastNum[i];
|
|
return max;
|
|
}
|
|
|
|
int main()
|
|
{
|
|
cin>>n;dp();
|
|
cout<<maxValue()<<endl;
|
|
return 0;
|
|
}
|
|
作业3.2数字游戏
|
|
#include <bits/stdc++.h>
|
|
using namespace std;
|
|
void getnumber(string s);
|
|
void getresult();
|
|
const int N=1010;
|
|
int f[N][N],num[N][N],a[N];
|
|
int d[N][N];
|
|
int ans[N];
|
|
int cnt;
|
|
int n,k;
|
|
int main(){
|
|
string s;
|
|
int c,e;
|
|
cin>>n>>k;
|
|
cin>>s;
|
|
k--;
|
|
getnumber(s);
|
|
getresult();
|
|
cout<<f[n][k];
|
|
return 0;
|
|
}
|
|
void getnumber(string s){
|
|
for(int i=1;i<=s.size();i++){
|
|
a[i]=s[i-1]-'0';
|
|
}
|
|
for(int i=1;i<=n;i++){
|
|
for(int j=i;j<=n;j++){
|
|
num[i][j]=num[i][j-1]*10+a[j];
|
|
}
|
|
}
|
|
}
|
|
void getresult(){
|
|
for(int i=1;i<=n;i++){
|
|
f[i][0]=num[1][i]; //处理边界
|
|
}
|
|
for(int i=1;i<=n;i++){ //枚举处理多少个数字
|
|
for(int j=1;j<=k;j++){ //枚举插入多少个乘号
|
|
for(int t=1;t<i;t++){ //枚举最后乘号的乘号插入哪里(将前多少个数字划为一类)
|
|
f[i][j]=max(f[i][j],f[t][j-1]*num[t+1][i]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
作业4.1摸金校尉
|
|
#include <bits/stdc++.h>
|
|
using namespace std;
|
|
const int N=10000;
|
|
int servicetime[N];
|
|
int line[N];
|
|
int main(){
|
|
int n,s,sum,num;
|
|
cin>>n>>s;
|
|
for(int i=0;i<n;i++){
|
|
cin>>servicetime[i];
|
|
}
|
|
sort(servicetime,servicetime+n);
|
|
sum=servicetime[0]+s;
|
|
num=1;
|
|
for(int i=0;i<n;i++){
|
|
if(sum<servicetime[i]){
|
|
num+=1;
|
|
sum=servicetime[i]+s;
|
|
}
|
|
}
|
|
cout<<num;
|
|
}
|
|
作业4.2平均等待时间
|
|
#include <bits/stdc++.h>
|
|
using namespace std;
|
|
const int N=10000;
|
|
int servicetime[N];
|
|
int line[N];
|
|
int main(){
|
|
int n,s,sum;
|
|
cin>>n>>s;
|
|
for(int i=0;i<n;i++){
|
|
cin>>servicetime[i];
|
|
}
|
|
sort(servicetime,servicetime+n);
|
|
for(int i=0;i<n;i++){
|
|
line[i%s]+=servicetime[i];
|
|
sum+=line[i%s];
|
|
}
|
|
cout<<(sum*1.0/n);
|
|
}
|