parent
99ee6f3141
commit
12bd54e62f
@ -0,0 +1,543 @@
|
||||
实验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);
|
||||
}
|
Loading…
Reference in new issue