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;
}
};