A题:https://codeforces.com/contest/1466/problem/A
题意:给出n个在x轴上的点的坐标,任意选择两点与(0,1)构成三角形,求三角形的可能面积总共有多少个?
思路:由于点在x轴和y轴上,所以构成的三角形一定是个直角三角形,并且一条直角边是固定为1的,那么三角形的所有可能面积数就等于三角形所有可能的底边数,而我们可以通过枚举底边的所有可能,使用set进行一个去重,最后输出set的大小即可。
代码:
int n; cin >> n; for(int i = 1; i <= n; i++) cin >> a[i]; set<int> s; for(int i = 1; i <= n; i++) for(int j = i + 1; j <= n; j++) s.insert(a[i] - a[j]); cout << s.size() << endl;
B题:https://codeforces.com/contest/1466/problem/B
题意:给定一个数字序列,并且每个数字具有两种可能性,①保持不变,②在原有基础上+1,求解最多可以有多少个不同的数字?
思路:既然是求最大有多少个不同元素,我们还是可以很自然的联想到使用STL中的Set,如果x没出现过,那么我们就将x插入到集合中,否则我们判断x+1是否出现过,没有出现我们就将x+1插入到集合中,否则不插入,最后set的大小即是答案。
代码:
set<int> ans; int n; cin >> n; for(int i = 1; i <= n; i++) { int x; cin >> x; if(ans.count(x) == 0) ans.insert(x); else if(ans.count(x + 1) == 0) ans.insert(x + 1); } cout << ans.size() << endl;
C题:https://codeforces.com/contest/1466/problem/C
题意:给定一个字符串,通过改变k个字符的值使得整个字符串在删除任意个首尾元素后不存在回文串,求需要改变多少次。
思路:通过观察,我们可以发现只需要判断第i-1个字符和第i-2个字符是否于第i个字符相同,若相同,就需要将第i个字符改变,这是个结论,可以由归纳法证明。
代码:
void slove(string s) { int sum = 0; for(int i = 1; i < s.size(); i++) { if(s[i] == s[i - 1] || s[i] == s[i - 2]) { s[i] = ' '; sum++; } } cout << sum << endl; return ; }
E题:https://codeforces.com/contest/1466/problem/E
题意:给出n个值,计算
思路:这是一道需要化简的题,其实这个式子可以分解为其实这个式子可以分解为,并且和可以分开计算,而还可以用二进制继续分解,分解方式为,表示x[j]的第p位,因为每位之间互不干扰,就可以交换一下计算顺序,或运算同理。
代码:
void solve(){ memset(cnt,0,sizeof(cnt)); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%lld",&a[i]); for(int i=1;i<=n;i++) for(int j=0;j<=60;j++) cnt[j]+=((a[i]>>j)&1); LL ans=0; for(int i=1;i<=n;i++){ LL sumand=0,sumor=0; for(LL j=0,power=1;j<=60;j++,power=power*2%mod){ if(a[i]>>j&1){ sumand=(sumand+power*cnt[j]%mod)%mod; sumor=(sumor+power*n%mod)%mod; } else{ sumor=(sumor+power*cnt[j]%mod)%mod; } } ans=(ans+sumand*sumor%mod)%mod; } printf("%lld ",ans); }