1.31补卡

这个月确实摆了...

1.7

题意就是给出一个图,找出一条最短的路使其联通,如果找不出,输出orz 否则输出该路线的长度

传送门

就是最小生成树套板子就好

代码

#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e7+5;
int pre[N];

struct node
{
	int a,b,c;
}p[N];

int find(int x)
{
	if(x==pre[x])return x;
	return pre[x]=find(pre[x]);
}

bool cmp(node a,node b)
{
	return a.c<b.c;
}

int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>p[i].a>>p[i].b>>p[i].c;
	}
	sort(p+1,p+1+m,cmp);
	for(int i=1;i<=n;i++)pre[i]=i;
	int sum=0,ant=0;
	for(int i=1;i<=m;i++)
	{
		int a=find(p[i].a);
		int b=find(p[i].b);
		if(a!=b)
		{
			pre[a]=b;
			sum+=p[i].c;
			ant++;
		}
	}
	if(ant==n-1)
	{
		cout<<sum;
	}
	else
	{
		cout<<"orz";
	}
}

1.8

传送门

题意:  向地上铺地毯(覆盖),  给出一个点找出最上面的垫子是第几个(可以没有)

代码

#include<iostream>
using namespace std;
#define ll long long
const ll N=1e5+5;
struct node
{
	ll a,b,c,d;
}p[N];



int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int a,b,c,d;
		cin>>a>>b>>c>>d;
		p[i].a=a;
		p[i].b=b;
		p[i].c=a+c;
		p[i].d=b+d;
	}
	int a,b;
	cin>>a>>b;
	int fl=0,k=0;
	for(int i=1;i<=n;i++)
	{
		if(a>=p[i].a&&a<=p[i].c&&b>=p[i].b&&b<=p[i].d)
		{
			fl=1;
			k=i;
		}
	}
	if(fl==1)cout<<k;
	else cout<<-1;
}

1.9

传送门

题意:  输出多项式,给出最高次并给出各项的系数, 输出这个多项式

代码

#include<iostream>
#include<cmath>
using namespace std;

int main() {
	int n;
	cin >> n;
	for(int i=n;i>=0;i--)
	{
		int a;
		cin>>a;
		if(a!=0)
		{
			if(i!=n&&a>0)cout<<"+";
			if(a==-1&&i!=0)cout<<"-";
			if(abs(a)>1||i==0)cout<<a;
			if(i>1)cout<<"x^"<<i;
			if(i==1)cout<<"x";
		}
	}
	return 0;
}

1.10

传送门

递归求数(找规律)

 以4为例

4,14,24,124这4种

多试几个数字会发现a[n]这个数列的规律

奇数的解就是奇数-1的解,偶数的解就是偶数/2的解

代码

#include<iostream>
using namespace std;
#define ll long long

const ll N=1e4+4;

ll a[N]={0,1};

int main()
{
	int n;
	cin>>n;
	for(int i=2;i<=n;i++)
	{
		if(i&1)a[i]=a[i-1];
		else a[i]=a[i-1]+a[i/2];
	}
	cout<<a[n];
}

1.11

1元3次方程...

代码

#include<iostream>
using namespace std;
double a,b,c,d;
double ac(double x)
{
    return a*x*x*x+b*x*x+c*x+d;
}
int main()
{
    double l,r,m,x1,x2;
    int s=0,i;
    cin>>a>>b>>c>>d;
    for (i=-100;i<100;i++)
    {
        l=i; 
        r=i+1;
        x1=ac(l); 
        x2=ac(r);
        if(!x1) 
        {
            printf("%.2lf ",l); 
            s++;
        }
        if(x1*x2<0)
        {
            while(r-l>=0.001)
            {
                m=(l+r)/2;
                if(ac(m)*ac(r)<=0)
                   l=m;
                else
                   r=m;
            }
            printf("%.2lf ",r);
            s++;
        }
        if (s==3)
            break;
    }
    return 0;
}

1.12

枚举暴力

传送门

代码

#include<iostream>
using namespace std;
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int x;
int ac(int n)
{
    int ans=0,s=0;
    while(n)
    {
        s++;
        if(n%10==x)ans++;
        n/=10;
    }
    if(s==1&&x==0)ans++;
    return ans;
}
int main()
{
    int n,m;
    while(~scanf("%d%d%d",&n,&m,&x))
    {
        int ans=0;
        if((n%4==0&&n%100!=0)||n%400==0)month[2]=29;
        for(int i=1;i<=month[m]; i++)
        {
            ans+=ac(n)+ac(m)+ac(i);
        }
        month[2]=28;
        printf("%d\n",ans);
    }
}

1.13

背包

代码

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int a[105], f[105][10305], n, m;
int main() {
	while (~scanf("%d", &n)) {
		f[0][0] = 1;
		for (int i = 1; i <= n; i++) {
			scanf("%d", &a[i]);
			for (int j = 0; j <= 10000; j++) {
				f[i][j] = f[i - 1][j];
			}
			for (int j = 0; j <= 10000; j++) {
				f[i][j] |= f[i - 1][j + a[i]];
				f[i][j] |= f[i - 1][abs(j - a[i])];
				f[i][j] |= f[i - 1][j];
			}
		}
		cin >> m;
		for (int i = 1; i <= m; i++) {
			int k;
			scanf("%d", &k);
			if (k > 10000) {
				printf("NO\n");
				continue;
			}
			if (f[n][k]) {
				printf("YES\n");
			} else {
				printf("NO\n");
			}
		}
	}
}

1.14

1.15

1.16

1.17

1.18

1.19

1.20

1.21

1.22

1.23

1.24

1.25

1.26

1.27

贪心

代码

#include<iostream>
using namespace std;
int main(){
    double T,C,n;
    double t[10010],v[10010];
    cin>>n;
    cin>>T>>C;
    double tmp=T*C,v1=C,mi=10001,ma=0;
    for(int i=0;i<n;i++){
        cin>>t[i]>>v[i];
        v1+=v[i];
        tmp+=t[i]*v[i];
        mi=min(mi,t[i]);
        ma=max(ma,t[i]);
}
    double average=tmp/v1;
    if(average>=ma){
        cout<<"Possible"<<endl;
        printf("%.4f",average);
    }
    else if (average<=mi){
        cout<<"Possible"<<endl;
        printf("%.4f",mi);
}
    else{
        cout<<"Impossible"<<endl;
}
    
}

1.28

带权排列

#include<iostream>
using namespace std;
const int N = 1e5+5;
int main(){
    int n;
    scanf("%d",&n);
    if(n&1){
        for(int i=1;i<=n;i+=2) printf("%d ",i);
        for(int i=n-1;i>=2;i-=2) printf("%d ",i); 
    }else {
        for(int i=1;i<=n-1;i+=2) printf("%d ",i);
        for(int i=n;i>=2;i-=2) printf("%d ",i);
    }
    return 0;
}

1.29

字符串

代码

#include<iostream>
using namespace std;
#include<cstring>
int main() {
	char a[1000];
	scanf("%s", a);
	int l = strlen(a);
	if (a[l - 1] == a[l - 2]) {
		if (a[l - 3] == a[l - 4])
			printf("Yes");
		else
			printf("No");
	} else
		printf("No");
}

1.30

数学

代码

#include<iostream>
using namespace std;
const long long mod=1e9+7;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        long long a,b;
        scanf("%lld%lld",&a,&b);
        long long num=a*b;
        long long ans=0;
        ans+=num*4;
        ans%=mod;
        ans+=(a+1)*(b+1);
        ans%=mod;
        ans+=(a+b)*2;
        ans%=mod;
        cout<<ans<<endl;
    }
}

1.31

递归

代码

#include <iostream>
using namespace std;
int n, m;
void dfs(int u, int cnt, int state)
{
    if (cnt + n - u + 1 < m)    return ;
    if (cnt == m)
    {
        for (int i = 0; i < n; i ++)
            if (state >> i & 1)
                cout << i + 1 << ' ';
        cout << endl;
        return ;
    }
    if (u == n)    return ;
    
    dfs(u + 1, cnt + 1, state | (1 << u));
    dfs(u + 1, cnt, state);
}
int main()
{
    cin >> n >> m;
    dfs(0, 0, 0);
    return 0;
}

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值