2020.05.24期末代码存档

A题.

第一题就因为看错WA了一次

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cassert>
#include <climits>
#include <cfloat>
#include <cctype>
#include <stdio.h>
#include <string.h>
using namespace std;
//#define max(a,b) ((a)>(b)?(a):(b))
int main()
{
	char x[505],y[505];
	char a[505][505],b[505][505];
	int lenx,leny;
	int ans[505][505];
	while(scanf("%s %s",x,y)!=EOF)
	{
		lenx=strlen(x);
		leny=strlen(y);
		for(int i=0;i<=lenx;i++){
			ans[i][leny]=0;
		}

		for(int j=0;j<=leny;j++){
			ans[lenx][j]=0;
		}
		for(int i=lenx-1;i>=0;i--){
		    for(int j=leny-1;j>=0;j--){

        if(x[i]!=y[j]){ans[i][j]=max(ans[i+1][j],ans[i][j+1]);}
        if(x[i]==y[j]){ans[i][j]=ans[i+1][j+1]+1;}
        }
		}
		cout<<ans[0][0]<<endl;
	}
	return 0;
}

B题.

这个是古董题了,奶牛比赛变宇宙飞船2333

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cassert>
#include <climits>
#include <cfloat>
#include <cctype>
#include <stdio.h>
#include <string.h>
using namespace std;
const int maxn =100002;
int visited[maxn];
struct step
{
    int x;
    int steps;
    step(int xx,int ss):x(xx),steps(ss){};
};
queue <step>q;
int main()
{
    int n,k;
    cin>>n>>k;
    memset(visited,0,sizeof(visited));
    visited[n]=1;
    q.push(step(n,0));
    while(!q.empty())
    {
        step s=q.front();
        if(s.x==k)
        {
            cout<<s.steps<<endl;
            return 0;
        }
        else
        {
            if(s.x-1>=0&&!visited[s.x-1])
            {
                q.push(step(s.x-1,s.steps+1));
                visited[s.x-1]=1;
            }
            if(s.x+1<=maxn&&!visited[s.x+1])
            {
                q.push(step(s.x+1,s.steps+1));
                visited[s.x+1]=1;
            }
            if(s.x*2<=maxn&&!visited[s.x*2])
            {
                q.push(step(s.x*2,s.steps+1));
                visited[s.x*2]=1;
            }
            q.pop();

        }
    }
    return 0;
}

C题.

签到题

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cassert>
#include <climits>
#include <cfloat>
#include <cctype>
#include <stdio.h>
#include <string.h>
using namespace std;
//#define max(a,b) ((a)>(b)?(a):(b))
int main()
{
	int a[5];
	for(int i=1;i<=4;i++)
    {
        cin>>a[i];
    }
    if(a[1]!=a[4])cout<<0<<endl;
    else if(a[1]==0&&a[3]!=0)cout<<0<<endl;
    else cout<<1<<endl;
	return 0;
}

D题.

最开始没想用三分,想直接求平方和的最小值,好像平方和取最小值时绝对值和也最小啊,结果WA了5555,被迫三分。

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int n,x[15005],p[15005];
    double nu=0,de=0,l=0,r=50000;//分子 分母
    double me,mi,ans=0;
    double a,b,s,tmp;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d %d",&x[i],&p[i]);

    }
    //int k=0;
	while (l + 0.000001 < r)
	{
        //if(n>=k)de+=p[k];
		me=(l + r) / 2;
		//if(n>=k)nu+=x[k]*p[k];
		mi= (me + r) / 2;
        s=0;tmp=0;
	    for (int i =0;i<n;i++)
	    s+=p[i]*((x[i]>me)?x[i]-me:me-x[i]);
        tmp=s;
        s=0;
	    for (int i = 0; i < n; i++)
	    s+=p[i]*((x[i]>mi)?x[i]-mi:mi-x[i]);
		if (tmp<s)r = mi;
		else l = me;
		//k++;
	}
    ans=me;
    printf("%.5lf",ans);
	return 0;
}

E题.

这题做过

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cassert>
#include <climits>
#include <cfloat>
#include <cctype>
#include<stdio.h>
#include<string.h>
#include<math.h>
#define MAX 0x3f3f3f3f
using namespace std;
double cmap[101][101];
/*
3
12.345 23.456 34.567 1.234
1.234 2.345 3.456 2.345
4.321 5.432 6.543 3.456
*/
int main()
{
	int n,k;
    double x[101],y[101],z[101],r[101],m;
    int vis[101];
	while (scanf("%d",&n)==1&&n)
	{

		for (int i=0;i<n;i++)
		 	scanf("%lf %lf %lf %lf",&x[i],&y[i],&z[i],&r[i]);
        double t;
		for (int i=0;i<n;i++)
		{
			cmap[i][i]=0.000;
			for (int j=i+1;j<n;j++)
			{
				t=sqrt(pow((x[i]-x[j]),2)+pow((y[i]-y[j]),2)+pow((z[i]-z[j]),2));
				cmap[i][j]=t-r[i]-r[j];
				if (cmap[i][j]<1e-8) cmap[i][j]=0.000;
				cmap[j][i]=cmap[i][j];
			}
		}
		double d[101];
		for (int i=0;i<n;i++)
		{
			d[i]=cmap[0][i];
			vis[i]=0;
		}
		vis[0]=1;
		int st;
		for (k=0;k<n-1;k++)
		{
			m=MAX;
			st=-1;
			for (int i=1;i<n;i++)
				if (!vis[i]&&d[i]<m)
				{
					m=d[i];
					st=i;
				}
			if (st==-1) break;
			vis[st]=1;
			for (int i=1;i<n;i++)
				if (!vis[i]&&cmap[st][i]<d[i])
					d[i]=cmap[st][i];
		}
		double ans=0;
		for (int i=0;i<n;i++)
		{
			ans+=d[i];
		}
		printf("%.3lf\n",ans);
	}
}

F题.

最初尝试暴力求解结果直接GG,果然不会那么简单
这是TLE的代码

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <stdio.h>
#include <string.h>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cassert>
#include <climits>
#include <cfloat>
#include <cctype>
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
int  yue(int m,int n){
	if(m%n == 0)
        return n;
	else
		return yue(n,m%n);
}
int main()
{
	int m,n;
	int x,y;
	int ans;
	scanf("%d",&m);
	for(int k=1;k<=m;k++)
    {
        ans=0;
        scanf("%d",&n);
        for(int i=1;i<=n-1;i++)
            for(int j=i+1;j<=n;j++)
        {
            x=0;y=0;
            x=i^j;y=j-i;
            if(y==x)if(y==yue(j,i))ans++;
        }
        printf("Case %d: %d\n",k,ans);
    }

	return 0;
}

过了的代码

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <stdio.h>
#include <string.h>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cassert>
#include <climits>
#include <cfloat>
#include <cctype>
using namespace std;
#define MAX 30000005
int  yue(int m,int n){
	if(m%n == 0)
        return n;
	else
		return yue(n,m%n);
}
int ans[MAX];
int vis[MAX];
int main()
{
	int m,n;
	int x,y;
    //int ans[MAX];这个不能放main函数里,唉又忘了
	for(int i=0;i<MAX;i++){
        ans[i]=0;
    }
    for(int i=0;i<MAX;i++){
        vis[i]=1;
    }
    for(int i=1;i<MAX/2;i++){
        for(int j=2*i;j<MAX;j+=i){
            int yi=j^i;
            if((j-i)==yi)ans[j]++;
        }
    }
    for(int i=1;i<MAX;i++)
        ans[i]=ans[i]+ans[i-1];
	scanf("%d",&m);
	for(int k=1;k<=m;k++){
        scanf("%d",&n);
        printf("Case %d: %d\n",k,ans[n]);
    }

	return 0;
}

G题.

#include<iostream>
using namespace std;
bool findchar(const string& st,  char* ch,  int* cnt, bool issensitive=true){
     bool ret = true;
     int  table[52] = {0};
     int  max = 0, maxindex =0, index = -1;
 
     if(st.length() <= 0)
         return false;
     string str = st;
 
     for(unsigned int i=0; i<str.length(); i++) {
         if((str.at(i) <= 'Z') && (str.at(i) >= 'A') ) {
             index = static_cast<int>( str.at(i) - 'A');
             table[index]++;
         }
         else if((str.at(i) <= 'z') && (str.at(i) >= 'a')){
             index = static_cast<int>(str.at(i) - 'a') ;
             index += 26;
             table[index]++;
         }
     }
 
     if(issensitive) {
         for(int i=0; i<52;i++)  {
             if(max < table[i]){
                 max = table[i];
                 maxindex = i;
             }
         }
     }
     else{
         for(int i=0; i<26;i++)  {
             table[i] = table[i] + table[i+26];
             table[i+26] = 0;
         }
         for(int j=0; j<26; j++) {
             if(max < table[j]) {
                 max = table[j];
             }
         }
 
         for(unsigned int i=0; i<str.length();i++) {
             int cnt = -1;
             (str.at(i) > 'Z') ? (cnt = static_cast<int>(str.at(i) - 'a')) : \
                                 ( cnt = static_cast<int>(str.at(i) - 'A') );
             
             if(table[cnt] == max){
                 (str.at(i) > 'Z') ? (maxindex = 26 + cnt ) : (maxindex = cnt);
                 break;
             }
         }
     }
 
    if((maxindex < 26) && (max>1)  ) {
         *ch = maxindex + 'A';
         *cnt = max;
    }
    else if((maxindex >= 26) && (max>1) ) {
        *ch = maxindex + 'a' - 26;
        *cnt = max;
    }
    else if(max==1){
        *ch = str.at(0);
        *cnt = max;
    }
    return ret;
}
 
int main()
{
    char ch = 0;
    int cnt = 0;
    string str = "SssssMaammmmmmmaAde";
    if(findchar(str, &ch, &cnt, false))
        cout << "ch: " << ch << " cnt: " << cnt << endl;
    else
        cout << "failed" << endl;
}

H题.

和之前的题目一样的,换成神犇了2333,就这样吧,这个方法其实一点也不好

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <stdio.h>
#include <string.h>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cassert>
#include <climits>
#include <cfloat>
#include <cctype>
using namespace std;
#define MAX 100000

class csum {
public:
    int lsum,rsum;
    int msum,sum;
};

csum tree[4*MAX+1];
int sums[MAX +1],array[MAX+1];

void update(int node, int pos, int val, int a, int b ) {
    if (a==b&&a==pos)
    {
        tree[node]=((csum){val,val,val,val});
        return;
    }
    else if (pos<=(a+b)/2)
    {
        update(node*2,pos,val,a,(a+b)/2);
    }
    else if (pos>(a+b)/2)
    {
        update(node*2+1,pos,val,(a+b)/2+1,b);
    }
    csum left=tree[node*2 ],right=tree[node*2+1];
    tree[node] = ((csum){
                    max(left.lsum,left.sum+right.lsum ),
                    max(right.rsum,right.sum+left.rsum ),
                    max(left.msum, max(right.msum,right.lsum+left.rsum)),
                    left.sum + right.sum });
}
void next(int node, int pos, int val, int a, int b ) {
    csum left=tree[node*2 ],right=tree[node*2+1];
    tree[node] = ((csum){
                    max(left.lsum,left.sum+right.lsum ),
                    max(right.rsum,right.sum+left.rsum ),
                    max(left.msum, max(right.msum,right.lsum+left.rsum)),
                    left.sum + right.sum });
}
csum query( int node, int a, int b, int i, int j ){
    if (i==a&&j==b){
        return tree[node];
    }
    if (j<=(a+b)/2){
        return query(node*2,a,(a+b)/2,i,j);
    }
    if (i>(a+b)/2){
        return query(node*2+1,(a+b)/2+1,b,i,j);
    }
    csum left=query(node*2,a,(a+b)/2,i,(a+b) / 2 );
    csum right=query(node*2+1,(a+b)/2+1,b,(a+b)/2+1,j);
    return ((csum){
                max(left.lsum,left.sum+right.lsum),
                max(right.rsum,right.sum+left.rsum),
                max(left.msum,max(right.msum,right.lsum+left.rsum)),
                left.sum + right.sum});
}
void init(int node,int i,int j )
{
    if (i==j){
        tree[node]=((csum){array[i],array[i],array[i],array[i]});
    }
    else {
        init(node*2,i,(i+j)/2);
        init(node*2+1,(i+j)/2+1,j);
        csum left = tree[ node*2], right=tree[ node*2 +1];
        tree[node].lsum = max( left.lsum,left.sum+right.lsum );
        tree[node].rsum = max( right.rsum,right.sum+left.rsum );
        tree[node].msum=max( left.msum,max(right.msum,left.rsum+right.lsum ) );
        tree[node].sum=left.sum+right.sum;
    }
}
int main()
{
    int i,N,q,op,l,r;
    scanf("%d",&N);
    for (i=0;i<N;++i)scanf("%d",array+i);
    init(1,0,N-1);
    scanf("%d",&q);
    for ( i = 0; i < q; ++i ){
        scanf("%d%d%d",&op,&l,&r);
        if (op==0)update(1,l-1,r,0,N-1);
        else printf("%d\n", query(1,0,N-1,l-1,r-1).msum);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值