Codeforces Round #719 (Div. 3) [未完待续]
A. Do Not Be Distracted!
参考题解
直接模拟, set判重
#include <iostream>
#include <cstdio>
#include <set>
#include <string>
using namespace std;
bool func()
{
int n;
cin >> n;
set<char> ha;
char last = '0';
string ttp;
cin >> ttp;
for(int i = 0; i < ttp.size(); ++ i)
{
char tp = ttp[i];
if(tp == last) continue;
if(ha.count(tp))
{
return false;
}
else
{
ha.insert(tp);
last = tp;
}
}
return true;
}
int main()
{
int t;
cin >> t;
while(t --)
{
if(func())
{
cout << "YES" << endl;
}
else
{
cout << "NO" << endl;
}
}
return 0;
}
B. Ordinary Numbers
参考题解
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 105;
typedef long long LL;
int ans[N][N];
bool check(int x)
{
int bit = x%10;
while(x)
{
if(x%10 != bit)
{
return false;
}
x /= 10;
}
return true;
}
int main()
{
int t;
cin >> t;
while(t --)
{
int n;
scanf("%d", &n);
int bit = to_string(n).size();
int ans = 0;
ans += (bit-1)*9;
for(int i = 1; i <= 9; ++ i)
{
LL num = stoll(string(bit, '0'+i));
if(num <= n)
{
ans ++;
}
}
cout << ans << endl;
}
return 0;
}
C. Not Adjacent Matrix
参考题解
题解来源
构造问题,要让相邻单元格的差值不为1。
能构造输出,不能就直接-1。
所以想到用奇数和奇数相邻,偶数和偶数相邻。
可以先从小到大填充所有的奇数,填完奇数之后再从小到大填充完所有的偶数。
这种做法除了n = 2不满足情况应当输出-1外,其他的均可满足。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 105;
int ans[N][N];
int main()
{
int t;
cin >> t;
while(t --)
{
int n;
scanf("%d", &n);
if(n == 2)
{
printf("-1\n");
continue;
}
memset(ans, 0, sizeof ans);
int k = 1;
for(int i = 0; i < n; ++ i)
{
for(int j = 0; j < n; ++ j, k += 2)
{
if(k > n*n)
{
k = 2;
}
ans[i][j] = k;
}
}
for(int i = 0; i < n; ++ i)
{
for(int j= 0; j < n; ++ j)
{
if(j != 0)
{
cout << " " << ans[i][j];
}
else
{
cout << ans[i][j];
}
}
cout << endl;
}
}
return 0;
}
D. Same Differences
参考题解
aj - ai == j - i ==> aj - j == ai - i
注意ai-i取值范围(-n, n)
#include <iostream>
#include <cstdio>
#include <set>
#include <string>
#include <cstring>
using namespace std;
const int N = 2e5+5;
typedef long long LL;
int a[N*2];
int n;
int main()
{
int t;
cin >> t;
while(t --)
{
memset(a, 0, sizeof(a));
cin >> n;
for(int i = 0; i < n; ++ i)
{
int tp;
cin >> tp;
a[tp-i+n] ++;
}
LL ans = 0;
for(int i = 0; i <= n*2; ++ i)
{
ans = (ans + (LL)a[i]*(a[i]-1)/2);
}
cout << ans << endl;
}
return 0;
}
E. Arranging The Sheep
参考题解
绝对值三角不等式使用以下,取中间的绵羊就可以了
#include <iostream>
#include <cstdio>
#include <set>
#include <string>
#include <cstring>
using namespace std;
const int N = 2e5+5;
typedef long long LL;
LL func()
{
int n;
cin >> n;
string s;
cin >> s;
int l, r;
int cnt = 0;
for(int i = 0; i < s.size(); ++ i)
{
if(s[i] == '*')
{
cnt ++;
}
}
int tp = (cnt+1)/2;
cnt = 0;
int mid = 0;
for(int i = 0; i < s.size(); ++ i)
{
if(s[i] == '*')
{
cnt ++;
if(cnt == tp)
{
mid = i;
break;
}
}
}
LL ans = 0;
cnt = 1;
for(l = mid-1; l >= 0; -- l)
{
if(s[l] == '*')
{
ans += (mid-cnt-l);
cnt ++;
}
}
cnt = 1;
for(int r = mid+1; r < s.size(); ++ r)
{
if(s[r] == '*')
{
ans += (r-(mid+cnt));
cnt ++;
}
}
return ans;
}
int main()
{
int t;
cin >> t;
while(t --)
{
cout << func() << endl;
}
return 0;
}
F1. Guess the K-th Zero (Easy version)
参考题解
常规二分
#include <iostream>
#include <cstdio>
using namespace std;
int n, t, k;
//询问1的个数
int ask(int l, int r)
{
printf("? %d %d\n", l, r);
cout.flush();
int res = -1;
scanf("%d", &res);
if(res == -1)
{
exit(0);
}
return res;
}
int main()
{
cin >> n >> t >> k;
int l = 1, r = n;
while(l < r)
{
int mid = (l+r)/2;
int lcnt = mid-l+1 - ask(l, mid);
if(k <= lcnt)
{
r = mid;
}
else
{
l = mid+1;
k -= lcnt;
}
}
printf("! %d\n", l);
return 0;
}











浙公网安备 33010602011771号