Educational Codeforces Round 132 (Rated for Div. 2)+Codeforces Round #810 (Div. 2)

A. Three Doors

平平无奇的一个模拟水题,经常考下标的知识。



    #include <bits/stdc++.h>
    using namespace std;
    int a[3];
    int main(){
    	int t;
    	cin>>t;
    	while(t--){
    		int x;
    		cin>>x;
    		for(int i=1;i<=3;i++)
    			cin>>a[i];
    	if(a[x]==0) {printf("NO\n");} 
        else if(a[a[x]]==0) {printf("NO\n");}
    	else printf("YES\n");
    		
    	}
    }

B 多次询问,有条件的前后前缀和+差分,即可求得

数据范围,记得long long

    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    ll a[100010];	
    int n,m;
    ll d1[100010],d2[100010];
    void solve(){
    	cin>>n>>m;
    	for(int i=1;i<=n;i++) cin>>a[i];
    	 for(int i=1;i<=n;i++) {
    	 	d1[i]=d1[i-1];
    	 	if(a[i]<a[i-1]) d1[i]+=a[i-1]-a[i];
    	 }
    	 for(int i=n;i>=1;i--){
    	 	d2[i]=d2[i+1];
    	 	if(a[i]<a[i+1]) d2[i]+=a[i+1]-a[i];
    	 	
    	 }
    	 	while(m--){
    	 		int x,y;
    	 		cin>>x>>y;
    	 		if(x<y) cout<<abs(d1[y]-d1[x])<<endl;
    	 		else cout<<abs(d2[x]-d2[y])<<endl;
    	 		
    	 	}
    }
    int main(){
    	int t=1;
    	while(t--){
    		solve();
    	}
    	
       return 0;
    }

C 括号匹配问题,尽量让左边都是左括号,右边都是右括号,找到临界值进行判断。

    #include <bits/stdc++.h>
    using namespace std;
    const int N=2e5+10;
    #define  ll long long
    char a[N];
    int s[N];
    void solve(){
        cin>>a+1;
    	int len=strlen(a+1);
    	int tot=0,id=0;
    	for(int i=1;i<=len;i++){
    		if(a[i]=='(') tot++;
    		if(a[i]==')') tot--;
    		if(a[i]=='?') s[++id]=i;
    		
    	}
    	if(tot==id||id==-tot){
    		printf("YES\n");
    		return;
    	}
    	int mid=(id-tot)/2;
    	for(int i=1;i<mid;i++) a[s[i]]='(';
    	for(int i=mid;i<=id;i++) a[s[i]]=')';
    	a[s[mid+1]]='(';
    	tot=0;
    	bool ans=0;
    	for(int i=1;i<=len;i++){
    	if(a[i]=='(')tot++;
    	else tot--;
    	if(tot<0){
    		ans=1;
    		break;
    		
    	}	
    	}
    	if(ans) printf("YES\n");
    	else printf("NO\n");
    }
    int main(){
    	int t;
        scanf("%d",&t);
    	while(t--){
    		solve();
    	}
    	
    }

A 一道贪心而已,先输出这个数,然后每个数都会无法整除,最小为1

    #include <bits/stdc++.h>
    using namespace std;
    void solve(){
    	int x;
    	cin>>x;
    	cout<<x<<" ";
    	for(int i=1;i<x;i++) cout<<i<<" ";
    	cout<<endl;
    }
    int main(){
    	int t;
    	cin>>t;
    	while(t--){
    		solve();
    	}
    }

B题

建图,然后分情况考虑。首先m为偶数的时候,那么把需要的人邀请过来即可,不开心为0;

如果m为奇数,那么一定至少少一对朋友,可以少一个人,也可以少两个人,少两个人的情况直接两层遍历,少一个人的情况:如果这个人为偶数对关系,那么剩下的是奇数对关系,将这个人的值和剩下的奇数对关系的值比较即可。

    #include <bits/stdc++.h>
    using namespace std;
    vector<long long >a[100100];
    long long  b[100100];
    int t;	int n,m;	int x,y;
    int main(){
     
    	cin>>t;
    	while(t--){
    	cin>>n>>m;long long ans=0;
    	for(int i=1;i<=n;i++) a[i].clear();
    	for(int i=1;i<=n;i++) {
    		cin>>b[i];
    		ans+=b[i]; 
    	}
    for(int i=1;i<=m;i++){
    		
    			cin>>x>>y;
    			a[x].push_back(y);
    			a[y].push_back(x);
    			
    }
     
     
    	if((m%2)==0) {
    		cout<<"0"<<endl;
    	}
    	
        else{
      	    for(int i=1;i<=n;i++){
    	  	if(a[i].size()%2) ans=min(ans,b[i]);
    	  	
    	  }
    	  for(int i=1;i<=n;i++){
    	  	for(int j=0;j<a[i].size();j++){
    		  	int u=a[i][j];
    		  	ans=min(ans,b[i]+b[u]);
    		  }
    	  }
    	  cout<<ans<<'\n';
      }
    }
    	return 0;
    }

从这里书写我的奇迹。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值