SRM606题解(除T3外)

T1:

题目大意:两个人玩游戏,第一个人猜数字,第二个人回答和正确数字相差多少。进行n次后,问正确数字是多少。


主要思路:模拟!!!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<vector>
using namespace std;

void swap(int &a,int &b){
	int t=a; a=b; b=t;
}

int abs(int x){ return x<0?-x:x; }

class EllysNumberGuessing{
public:
	int check(int x){
		if (x<1) return 0;
		if (x>1000000000) return 0;
		return 1;
	}

	int getNumber(vector <int> guesses, vector <int> answers){
		int n=guesses.size();
		int ans1=-answers[0]+guesses[0];
		int ans2=answers[0]+guesses[0];
		if (!check(ans1)) ans1=0;
		if (!check(ans2)) ans2=0;
		for (int i=1; i<n; ++i){
			if (ans1 && abs(ans1-guesses[i])!=answers[i]) ans1=0;
			if (ans2 && abs(ans2-guesses[i])!=answers[i]) ans2=0;
		}
		if (ans1 && ans2) return -1;
		if (!ans1 && !ans2) return -2;
		return ans1+ans2;
	}
};

T2:

题目大意:有n个组,每堆有count[i]个数字(生成规则为:num[1]=first[i],  num[j]=(num[j-1]*mult[i]+add[i])%M (j=2...count[i])),现在要对n堆中所有数字进行组合,每个组合有两个数字且不相等,问最多能有多少个组合。


主要思路: 如果数字总数为T,如果有存在一个数字S,数量tot(S)大于等于T/2,显然答案就是T-tot(S)。当所有数字个数都小于T/2时,答案既是T/2(想象一下,把所有相同数字排成一列,然后按列高从高到低从左到右排,每次取最左边两列的数字,再重新排列,这样取就能达到T/2).


#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;

void solve(int& ans,int& sum,int x){
	if (x==ans){
		++sum;
		return ;
	}
	if (sum==0){
		ans=x;
		sum=1;
		return ;
	}
	--sum;
}

class EllysPairing{
public:
	int getMax(int m, vector <int> count, vector <int> first, vector <int> mult, vector <int> add){
		int ans1=0,sum1=0;
		int n=count.size();
		for (int i=0; i<n; ++i){
			int x=first[i];
			solve(ans1,sum1,x);
			for (int j=1; j<count[i]; ++j){
				long long y=x;
				y=(y*mult[i])&(long long)(m-1);
				x=(y+add[i])&(m-1);
				solve(ans1,sum1,x);
			}
		}
		int T=0;
		sum1=0;
		for (int i=0; i<n; ++i){
			T+=count[i];
			int x=first[i];
			if (x==ans1) ++sum1;
			for (int j=1; j<count[i]; ++j){
				long long y=x;
				y=(y*mult[i])&(long long )(m-1);
				x=(y+add[i])&(m-1);
				if (x==ans1) ++sum1;
			}
		}
		if (sum1>=T-sum1) return T-sum1;
		return T/2;
	}
};


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值