当前位置: 首页 > 工具软件 > bitcoin-abc > 使用案例 >

ABC243 ABCDE

胡夕
2023-12-01

A    

题目大意: 

由于我不会用洛谷博客,所以就用的CSDN写的...... 

A,B,C三个人洗头,用同一瓶洗发水,其中共有x毫升洗发水:  

求用它的最后一个洗头的人。  

也就是说 ans = x mod (A+B+C);  

接下来判断:

1. 当ans<=A时,输出F;

2. 当ans<=A+B时,输出M;  

3. 当ans<=A+B+C时,输出T;

然后,没有然后了。

代码实现:

#include<iostream>  

#include<cstdio>  

using namespace std; 

int main(){ 

    int x,a,b,c,ans; 

    cin>>x>>a>>b>>c; 

    ans=x%(a+b+c); 

    if(ans<a) printf("F");  

    else{ 

        if(ans<a+b) printf("M"); 

        else printf("T"); 

    } 

    return 0; 

} 

B   

题目大意:

有两行数,判断是否存在一样的:数一样,位置一样,先输出;数一样,位置不一样,换行输出。  

题意很简单,直接多来几遍枚举,判断即可。 

代码实现: 

#include<iostream>

#include<cstdio>

#include<cstring>

#include<cmath>

#include<cstdlib>

#include<algorithm>

int a[1005],b[1005];

using namespace std;

int ans1,ans2;

int main(){

    int n;

    cin>>n;

    for(int i=1;i<=n;i++) cin>>a[i];

    for(int i=1;i<=n;i++) cin>>b[i];

    for(int i=1;i<=n;i++)

        for(int j=1;j<=n;j++){

            if(a[i]==b[j]){

                if(i==j) ans1++;

                else ans2++;

            }

        }

    cout<<ans1<<endl<<ans2;

    return 0;

}

题目大意:  

一个平面坐标系,给几个坐标,告诉它们移动的方向(只能左右移动),考虑是否可能会有点相遇,那么相遇时:

1.两个人的纵坐标相等 

2.横坐标较小的人向右走,横坐标较大的人向左走

所以可以用桶的思想,存储对于每一条水平直线上,所有向左走的最大横坐标(如果其他向左走的人能相遇,与他同向同坐标的横坐标最大的也能相遇)(2.),然后枚举向右走的中是否存在与其纵坐标相同(1.)并且向左走,然后横坐标还是大的。

代码实现: 

#include<iostream>//cin,cout

#include<cstdio>//scanf,printf

#include<cstring>//ring类

#include<cmath>//数学库

#include<cstdlib>//freopen,system等

#include<algorithm>

#include<map>

using namespace std;

int x[2000005],y[2000005];

map<int,int> a;

string s;

int main(){

    int n;

    cin>>n;

    for(int i=0;i<n;i++) cin>>x[i]>>y[i];

    cin>>s;

    for(int i=0;i<n;i++)

        if(s[i]=='L'&&a[y[i]]<x[i])//左边有,并且可以向左移

        a[y[i]]=x[i];

    for(int i=0;i<n;i++)

        if(s[i]=='R'&&a[y[i]]>x[i]){//向右移,并且右边的那个点是向左移的

            cout<<"Yes";

            return 0;

    }

    cout<<"No";

    return 0;

}

 D 

题目大意:  

一棵二叉树,第i个节点的左儿子是 i×2,右儿子是 i×2+1。给最开始所在的点,输出操作之后点所在的位置。操作有三种:

1.U :走到当前节点的父亲

2.L :走到当前节点的左儿子

3.R:走到当前节点的右儿子

输出操作完的点。此时一个 L 或一个 R可以和一个 U 抵消(也就是说/2 可以和 ∗2+1 抵消),所以只需要用一个栈来把所有可能被抵消的抵消,之后就是模拟了。(注意long long)

代码实现: 

#include<iostream>//cin,cout
#include<cstdio>//scanf,printf
#include<cstring>//ring类
#include<cmath>//数学库
#include<cstdlib>//freopen,system等
#include<algorithm>//算法库
#include<stack>//stl栈
#include<string>//ring类
#include<map>//hash映射
#include<queue>//优先队列
#include<iomanip>//输出控制
#include<vector>//容器系列
#include<set>//不常用
#include<deque>//双向容器
#include<bitset>//二进制
using namespace std;
char s[1000005];
vector<char> a;
int main(){
    long long n,x;
    cin>>n>>x;
    cin>>(s+1);
    for(long long i=1;i<=n;i++){
        if(s[i]=='U'&&!a.empty()&&a.back()!='U') a.pop_back();
        else a.push_back(s[i]);
    }
    for(long long i=0;i<a.size();i++){
        if(a[i]=='U') x=x/2;
        if(a[i]=='L') x=x*2;
        if(a[i]=='R') x=x*2+1;
    }
    cout<<x<<endl;
    return 0;
}

E

题目大意:  

给定一个图,尽可能地删除边,且保证任意两点之间的最短路不变。这个题范围较小,不用long long也能过。所以跑Floyd就行,Gi,j​表示(i,j)之间的最短路,对于所有的i!​=j!=k,删除Gi,j​=Gi,k​+Gk,j​的边。

代码实现:

#include<iostream>//cin,cout
#include<cstdio>//scanf,printf
#include<cstring>//ring类
#include<cmath>//数学库
#include<cstdlib>//freopen,system等
#include<algorithm>//算法库
#include<stack>//stl栈
#include<string>//ring类
#include<map>//hash映射
#include<queue>//优先队列
#include<iomanip>//输出控制
#include<vector>//容器系列
#include<set>//不常用
#include<deque>//双向容器
#include<bitset>//二进制
using namespace std;
long long a[310][310],n,m,cnt; 
long long x,y,w;
int main(){
    cin>>n>>m;
    for(long long i=1;i<=n;i++){
    	for(long long j=1;j<=n;j++)
    	    a[i][j]=1ll*(!(i==j))<<60;
	}
    for(long long i=1;i<=m;i++){
        cin>>x>>y>>w;
        a[x][y]=min(a[x][y],w);
		a[y][x]=min(a[y][x],w);
    }
    for(long long k=1;k<=n;k++){
    	for(long long i=1;i<=n;i++){
    		for(long long j=1;j<=n;j++){
    			a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
			}
		}
	}
    for(long long i=1;i<=n;i++){
    	for(long long j=1,tmp=1;j<=n;j++){
       		tmp=1;
        	if(i!=j){
            	for(long long k=1;k<=n;k++){
            		if(tmp){
            			tmp=!(i!=k&&j!=k&&a[i][j]==a[i][k]+a[k][j]);
					}
				}
            	cnt+=tmp;
        	}
    	}
	} 
	long long ans=m-(cnt>>1);
    cout<<ans;
    return 0;
}

 类似资料:

相关阅读

相关文章

相关问答