第五周

INT_MAX:表示 int 类型的最大值。
UINT_MAX:表示 unsigned int 类型的最大值。
LONG_MAX:表示 long 类型的最大值。
ULONG_MAX:表示 unsigned long 类型的最大值。
LLONG_MAX:表示 long long int 类型的最大值。
ULLONG_MAX:表示 unsigned long long int 类型的最大值。
这些宏定义在 <limits.h> 或 头文件中声明。通过使用这些宏定义,可以确保在不同平台上使用正确的数据类型的最大值,避免溢出问题。

洛谷P2142 高精度减法

点击查看代码
#include <bits/stdc++.h>
using namespace std;

string a,b;
int na[10500],nb[10500],ans[10500];
bool pd;
int main()
{
	cin>>a>>b;
	if((a<b&&a.size()==b.size())||a.size()<b.size())
	{
		swap(a,b);
		pd=true;
	}
	for(int i=a.size();i>0;i--)
	{
		na[i]=a[a.size()-i]-'0';
	}
	for(int i=b.size();i>0;i--)
	{
		nb[i]=b[b.size()-i]-'0';
	}
	int max1=max(a.size(),b.size());
	for(int i=1;i<=max1;i++)
	{
		if(na[i]<nb[i])
		{
			na[i+1]--;
			na[i]+=10;
		}
		ans[i]=na[i]-nb[i];
	}
	while(ans[max1]==0)
		max1--;
	if(pd==true)cout<<"-";
	for(int i=max1;i>0;i--)
	{
		cout<<ans[i];
	}
	if(max1<1)
		cout<<"0";
	return 0;
}

洛谷P1601 高精度加法

点击查看代码
#include <bits/stdc++.h>
using namespace std;
char f[505]={0};
char *jia(char a[],char b[])
{
	int k;
	int i;
	
	for(i=0;i<505;i++)
	{
		f[i]+=a[i]+b[i];
		k=f[i]/10;
		f[i]=f[i]%10;
		f[i+1]+=k;
	}
	return f;
}
int main()
{
	string a,b;
	cin>>a>>b;
	char c[505]={0},d[505]={0};
	for(int i=0;i<a.size();i++)
	{
		c[i]=a[a.size()-i-1]-'0';
	}
	for(int i=0;i<b.size();i++)
	{
		d[i]=b[b.size()-i-1]-'0';
	}
	char* k;
	k=jia(c,d);
	int t=504;
	while(t>0&&k[t]==0)
	{
		t--;
	}
	for(int i=t;i>=0;i--)
	{
		cout<<(int)k[i];
	}
	return 0;
}

洛谷P1303 高精度乘法

点击查看代码
#include <bits/stdc++.h>
using namespace std;
string a1,b1;
int a[10001],b[10001],i,x,len,j,c[10001];
int main()
{
	cin>>a1>>b1;
	int lena=a1.size();
	int lenb=b1.size();
	for(i=1;i<=lena;i++)
	{
		a[i]=a1[lena-i]-'0';
	}
	for(i=1;i<=lenb;i++)
	{
		b[i]=b1[lenb-i]-'0';
	}
	for(i=1;i<=lenb;i++)
	{
		for(j=1;j<=lena;j++)
		{
			c[i+j-1]+=a[j]*b[i];
		}
	}
	for(i=1;i<lena+lenb;i++)
	{
		if(c[i]>9)
		{
			c[i+1]+=c[i]/10;
			c[i]%=10;
		}
	}
	len=lena+lenb;
	while(c[len]==0&&len>1)
	{
		len--;
	}
	for(i=len;i>=1;i--)
	{
		cout<<c[i];
	}
	return 0;
}

洛谷P1480 高精度除法

点击查看代码
#include <bits/stdc++.h>
using namespace std;
string a1;
long long a[10001],i,x,n,c[10001];
long long b;
int main()
{
	cin>>a1>>b;
	long long lena=a1.size();
	for(i=1;i<=lena;i++)
	{
		a[i]=a1[i-1]-'0';
	}
	for(i=1;i<=lena;i++)
	{
		x=x*10+a[i];
		c[i]=x/b;
		x=x%b;
	}
	n=1;
	while(c[n]==0&&n<lena)
	{
		n++;
	}
	for(i=n;i<=lena;i++)
	{
		cout<<c[i];
	}
	cout<<endl;
	return 0;
}

高精度取模
1)高精度对高精度取模(以在高精度除高精度中实现,此处不再赘述)
2)高精度对单精度取模
传入参数约定:传入第一参数为string类型,第二个为int型,返回值为string类型
算法思想:利用(a+b)%c=a%c+b%c。
算法复杂度:o(n).

#include<iostream>
#include<algorithm>
using namespace std;
int mod(string a,int b)//高精度a除以单精度b
{
    int d=0;
    for(int i=0;i<a.size();i++)  d=(d*10+(a[i]-'0'))%b;  //求出余数
    return d;
}
int main()
{
    string a;
    int b;
    while(cin>>a>>b)
    {
        cout<<mod(a,b)<<endl;
    }
    return 0;
}

KK 与答辩 - Gym 102899E - Virtual Judge
解法一:
https://vjudge.net/problem/Gym-102899E

点击查看代码
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;

int main() {
	int T;
	cin >> T;
	
	while (T--) {
		int n;
		cin >> n;
		unordered_map<string, int> scores;
		for (int i = 0; i < n; i++) {
			int ai;
			cin >> ai;
			string kk;
			int kkScore;
			int a,b;
			cin>>kk>>a>>b;
			kkScore=a+b;
			for (int j = 0; j < ai-1; j++) {
				string name;
				int score1, score2;
				cin >> name >> score1 >> score2;
				
				if (scores.find(name) == scores.end()){
					scores.insert({name,0});
				}
				if(score1+score2>=kkScore)
				{
					scores[name]=1;
				}
			}
		}
		
		int count = 0;
		for (const auto& it : scores) {
			if (it.second==0) {
				count++;
			}
		}
		
		cout << count << endl;
	}
	
	return 0;
}

解法二

点击查看代码
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;

int main() {
	int T;
	cin >> T;
	
	while (T--) {
		int n;
		cin >> n;
		unordered_map<string, pair<int,bool>> scores;
		for (int i = 0; i < n; i++) {
			int ai;
			cin >> ai;
			string kk;
			int kkScore;
			int a,b;
			cin>>kk>>a>>b;
			kkScore=a+b;
			for (int j = 0; j < ai-1; j++) {
				string name;
				int score1, score2;
				cin >> name >> score1 >> score2;
				if (scores.find(name) == scores.end()){
					scores[name].second=0;
				}
				scores[name].first = score1 + score2;
				if(scores[name].first>=kkScore)
				{
					scores[name].second=1;
				}
			}
		}
		
		int count = 0;
		for (const auto& it : scores) {
			if (it.second.second==0) {
				count++;
			}
		}
		
		cout << count << endl;
	}
	
	return 0;
}

2024牛客寒假算法基础集训营6
b爱恨的纠葛

点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],b[N];
int n;
int main() {
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}for(int i=1;i<=n;i++)
	{
		cin>>b[i];
	}sort(a+1,a+n+1);
	int min_=1e9+2,pos1=0,pos2=0;
	for(int i=1;i<=n;i++)
	{
		int x;
		x=lower_bound(a+1,a+1+n,b[i])-a;
		//查找数组a中第一个大于或等于目标值b[i]的元素的位置,并将该变量的位置赋值给变量x
		if(abs(a[x]-b[i])<min_)
		{
			pos1=x;
			pos2=i;
			min_=abs(a[x]-b[i]);
		}
		if(abs(a[x-1]-b[i])<min_)
		{
			pos1=x-1;
			pos2=i;
			min_=abs(a[x]-b[i]);
		}
	}
	swap(a[pos1],a[pos2]);
	for(int i=1;i<=n;i++)
	{
		cout<<a[i]<<" ";
	}
	return 0;
}

i时空的交织

点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
long long a[N],b[N];
int n,m;
int main() {
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>m;
	long long mx1=-1e18,mx2=-1e18,mn1=1e18,mn2=1e18,sum=-1e18,ans=1e18;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		sum=max(sum+a[i],a[i]);
		ans=min(ans+a[i],a[i]);
		mx1=max(mx1,sum);
		mn1=min(mn1,ans);
	}
	sum=-1e18,ans=1e18;
	for(int i=1;i<=m;i++)
	{
		cin>>b[i];
		sum=max(sum+b[i],b[i]);
		ans=min(ans+b[i],b[i]);
		mx2=max(mx2,sum);
		mn2=min(mn2,ans);
	}
	long long x=max(max(mx1*mx2,mx1*mn2),max(mn1*mx2,mn1*mn2));
	cout<<x;
	return 0;
}

洛谷P1996 约瑟夫问题

点击查看代码
 #include<iostream>
 #include<queue>
 using namespace std;
    
 int main()
 {
        int tot, outNum, nowNum = 1;
        queue<int> q;
        cin >> tot >> outNum;                        //读取数据
        for (int i = 1; i <= tot; i++)q.push(i);    //初始化队列
        while (!q.empty())                    //在队列不为空时继续模拟
        {
            if (nowNum == outNum)
            {
                cout << q.front() << " ";    //打印出局的人的编号
                q.pop();                    //出局
                nowNum = 1;                    //初始化现在的数字
            }
            else
            {
                nowNum++;
                q.push(q.front());            //排至队尾
                q.pop();
            }
        }
        cout << endl;
        return 0;
}

P1219 [USACO1.5] 八皇后 Checker Challenge

点击查看代码
#include<cstdio>
#include<iostream>
using namespace std;
int ans[14],check[3][28]={0},sum=0,n;
void eq(int line)
{
    if(line>n)
    {
        sum++;
        if(sum>3) return;
        else
        {
            for(int i=1;i<=n;i++) printf("%d ",ans[i]);
            printf("\n");
            return;
        }
    }
    for(int i=1;i<=n;i++)
    {
        if((!check[0][i])&&(!check[1][line+i])&&(!check[2][line-i+n]))
        {
            ans[line]=i;
            check[0][i]=1; check[1][line+i]=1; check[2][line-i+n]=1;
            eq(line+1);
            check[0][i]=0; check[1][line+i]=0; check[2][line-i+n]=0;
        }
    }
}
int main()
{
    scanf("%d",&n);
    eq(1);
    printf("%d",sum);
    return 0;
}

P1042 [NOIP2003 普及组] 乒乓球

点击查看代码
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
string s[100001];
int a[100001],b[100001],a2[100001],b2[100001];
bool check(int x)
{
	int t=s[x].size();
	for(int i=0;i<t;i++)
	if(s[x][i]=='E')return 0;
	return 1;
}
int main()
{
	int n=1,i,j,t=1,t2=1;
	cin>>s[n];
	while(check(n))
	{
		n++;
		cin>>s[n];
	}
	for(i=1;i<=n;i++)
	{
		int sz=s[i].size();
		for(j=0;j<sz;j++)
		{
			if(s[i][j]=='E')
			{
				for(i=1;i<=t;i++)
				cout<<a[i]<<":"<<b[i]<<endl;
				cout<<endl;
				for(i=1;i<=t2;i++)
				cout<<a2[i]<<":"<<b2[i]<<endl;
				return 0;
			}
			if(s[i][j]=='W')
			a[t]++,a2[t2]++;
			else if(s[i][j]=='L')
			b[t]++,b2[t2]++;
			if((a[t]>=11||b[t]>=11)&&abs(a[t]-b[t])>=2)
			{
				t++;
			}
			if((a2[t2]>=21||b2[t2]>=21)&&abs(a2[t2]-b2[t2])>=2)
			{
				t2++;
			}
		}
	}
	return 0;
}

P1873 [COCI 2011/2012 #5] EKO / 砍树

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const long long N=10000010;
long long n,m,a[N],tmp,l,r,ans;
bool check(long long x){
	for(long long i=1;i<=n;i++)
	    if(x<a[i])tmp+=a[i]-x;
	return m<=tmp;//骚写法,如果满足条件则返回1 
}
int main(){
	cin>>n>>m;
	for(long long i=1;i<=n;i++)cin>>a[i],r=r>a[i]?r:a[i];
	while(l<=r){
		long long mid=(l+r)>>1;tmp=0;
		if(check(mid))l=(ans=mid)+1;//在右区间查找,同时更新答案 
		else r=mid-1;//在左区间查找 
	}
	cout<<ans;
	return 0;
}
posted @ 2024-02-25 12:23  miao-jc  阅读(11)  评论(0编辑  收藏  举报