手速场 推荐做
A. Do Not Be Distracted!(字符打标记)
题意:
输入:
出现过的字符 除了在他出现的那个连续区间可以重复出现,后面都不可出现
输出
如果后面没出现则则输出"YES" 否则"NO"
条件:
都是大写字母
思路:
打标记判断,(连续区间这里卡了我一下,但是我还是硬着头皮(s[i] == s[i-1]))
code:
#include <bits/stdc++.h>
using namespace std;
int st[26];
int main()
{
int t;
cin>>t;
while (t -- )
{
int n;
cin>>n;
memset(st,0,sizeof st);
string s;
cin>>s;
bool flag = false;
for(int i=0;i<n;i++)
{
if(!st[s[i]-'A'] )
{
st[s[i]-'A']= 1;
}
else
{
if(s[i] == s[i-1])
continue;
else
{
flag = true;
cout<<"NO"<<endl;
break;
}
}
}
if(!flag)
cout<<"YES"<<endl;
}
return 0;
}
B - Ordinary Numbers(数论/预处理/思维)
题意:
输入
输入一个t和多个n
条件
普通数字即 每个数字各个位相同
输出
输出1-n中的普通数字
思路(推公式):
因为范围1e9,所以推公式,先打1e5的表出思路,后面推公式
公式如下
ans = 9*(位数-1) + (最大位数 或者 最大位数-1)
code1:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll ;
int main()
{
int t;
cin>>t;
while(t -- )
{
int n;
cin>>n;
if(n<10)
cout<<n<<endl;
else
{
int ws = 0;
int temp = n;
int maxx = 0;
while(temp!= 0)
{
maxx = temp;
ws++;
temp/=10;
}
int ans = 0;
ans = 9*(ws-1);
ll mid = 0 ;
for(int i=1;i<=ws;i++)
{
mid+=maxx;
mid*=10;
}
mid/=10;
// cout<<mid<<endl;
if(n>=mid)
ans+=maxx;
else
ans+=(maxx-1);
cout<<ans<<endl;
}
}
return 0;
}
思路(思维):
直接枚举一下由每个数字构成的数即可,最多有9位。
code2:
代码和思路转载自:yanwu
int n, m;
int main()
{
int T;
cin >> T;
while (T -- )
{
cin >> n;
int res = 0;
for (int i = 1; i <= 9; i ++ )
{
LL t = i;
while (t <= n)
{
res ++ ;
t = t * 10 + i;
}
}
cout << res << endl;
}
return 0;
}
思路(预处理)
不会不会不会
code:
C. Not Adjacent Matrix(构造+思维)
题意:
输入
输入一个t和n
条件
每个数的上下左右四个数 与他本身的绝对值差不能等于1
输出
输出一个 nn的矩阵 由 1-nn个数字构成
思路:
经过我的大哥wck提示
1 3 5 7 9…2 4 6 8…
只有2是-1
code:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MAX=1e5+10;
const int INF=0x3f3f3f3f3f3f3f3f;
const int mod=1e9+7;
int a[105][105];
void solve(){
int n;
cin>>n;
if(n==2){
cout<<-1<<'\n';
return ;
}
for(int i=0;i<n;i++){
for(int j=i;j<n+i;j++){
a[i][j%n]=i+1+(j-i)*n;
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cout<<a[i][j]<<' ';
}
cout<<'\n';
}
}
signed main() {
int _=1;
cin>>_;
while(_--){
solve();
}
return 0;
}
D - Same Differences(思维+变换公式+map处理)
题意
输入
输入一个t和n 和一个n长的数组
条件
输出
输出符合条件的 组数
思路
变换公式 a[i] - i = a[j] - j
然后通过map处理
code:
#include <bits/stdc++.h>
using namespace std;
map<int,int> mp;
const int N =2e6+10;
int a[N];
int main()
{
int t;
cin>>t;
while(t -- )
{
int n;
cin>>n;
mp.clear();
long long ans = 0 ;
for(int i=1; i<=n; i++)
{
cin>>a[i];
ans+= (mp[a[i]-i]);
mp[a[i]-i]++;
}
cout<<ans<<endl;
}
return 0;
}
E - Arranging The Sheep(中位数)
题意
输入
输入一个t和n 在输入一个字符串 只有* 和 . 的字符串 * 表示羊羔
条件
每只羊都可以移动
所有羊不能重叠的 排在一起 如(******)
输出
输出羊的最小移动步数
思路
中位数的性质: 所有的到中位数最短
同时还要判断中间有没有羊就行(因为羊不能重叠)
code:
#include <iostream>
using namespace std;
typedef long long ll ;
int idx ;
int main()
{
int t;
cin>>t;
while(t -- )
{
int n;
cin>>n;
string s;
cin>>s;
int a[n+1] = {0};
ll sum = 0;
for(int i=0; i<n; i++)
{
if(s[i] == '*')
a[++idx] = i+1;
}
int mid = a[(idx+1)/2];
for(int i=1; i<=idx; i++)
{
sum +=abs(a[i] - mid ) -abs(((idx+1)/2) - i );
}
cout<<sum<<endl;
idx = 0;
}
return 0;
}