A 银河间的数字之战
题目大意 : 输入 A 、B 输出 A + B
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a , b ;
scanf("%d %d",&a,&b);
printf("%d",a+b);
return 0 ;
}
B 特殊数字
题目大意 : 给定一个区间 [n , N] 计算区间内满足能同时被 2 和 3 整除的数之和
N∈[1,1e5] , ans∈[1,1e5(1+1e5)/2] , ansMax < 1e9 因此 答案是属于 int 范围内的
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n , N , ans = 0 ;
scanf("%d,%d",&n,&N) ;
while ( n <= N )
{
if ( n % 2 == 0 && n % 3 == 0 ) ans += n ;
n ++ ;
}
printf("%d",ans);
return 0 ;
}
C 小码哥的艰难选择
题目大意 : 总共有n个回合,每个回合某个花有分数变化问最低的是什么,如果有相同值输出第一个出现的
#include <bits/stdc++.h>
using namespace std;
int main()
{
unordered_map<string,int> mp;
int n ;
cin >> n ;
string loser = "ZXR" ;
mp[loser] = 1000 ;
while ( n-- )
{
string str ;
int sorce , minn = 1000 ;
cin >> str >> sorce ;
mp[str] += sorce ;
for(auto s : mp)
{
if (s.second < minn)
{
minn = s.second ;
if ( minn < mp[loser] ) loser = s.first ;
}
}
}
cout << loser << '\n' << mp[loser] + 1000 ;
return 0 ;
}
D 世界警察大战
滑动窗口模板题
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10 ;
int a[N] , n , ans ;
int main()
{
scanf("%d",&n) ;
for(int i = 0 ; i <= n ; i++ ) scanf("%d",&a[i]) ;
unordered_map<int,int> mp;
int left = 0 , right = 0;
while ( right < n )
{
mp[a[right]] ++ ;
while (left < right && mp[a[right]] > 1)
{
mp[a[left++]]--;
}
ans = max(right - left + 1, ans);
right ++ ;
}
printf("%d",ans);
return 0 ;
}
E 找鸭子
题目大意 : 给一个字符串输出字符串最大的字符
void solve()
{
string s ;
cin >> s;
cout << char( *max_element(s.begin(),s.end()) ) ;
}
F 小码哥的英语
俩种合法方案 : ABAB…… / BABA……
#include <bits/stdc++.h>
using namespace std ;
char change(char ch) { return char('A' + 'B' - ch ) ;}
int solve(string str)
{
int a = 0, b =0 ;
char ch = 'A' ;
for(auto s : str)
{
if (s != ch) a++;
else if (s != change(ch)) b++;
ch = change(ch) ;
}
return min(a,b);
}
int main()
{
int n ;
scanf("%d",&n);
while (n--)
{
string str ;
cin >> str ;
printf("%d\n",solve(str));
}
return 0 ;
}
G 中转站
dfs跑一遍
#include<bits/stdc++.h>
using namespace std;
// 手写链表版
const int inf = 0x3f3f3f3f , N = 510 , M = 1e5 + 10;
int h[N] , e[M] , ne[M] , idx , n , m ;
bitset<N>st;
void add(int a,int b) { e[idx] = b , ne[idx] = h[a] , h[a] = idx++ ; }
bool dfs(int x)
{
if ( x == n ) return true ;
for(int i = h[x] ; i != -1 ; i = ne[i] )
{
int j = e[i] ;
if ( !st[j] )
{
st[j] = true ;
if ( dfs(j) ) return true ;
}
}
return false ;
}
void solve()
{
memset(h,-1,sizeof h) ;
scanf("%d%d",&n,&m) ;
while ( m-- )
{
int u , v;
scanf("%d%d",&u,&v);
add(u,v) ;
}
if ( dfs(1) ) puts("Yes") ;
else puts("No");
}
int main()
{
solve();
return 0 ;
}
H 神器宝盒
题目大意 : 如果输入的不是10的倍数则翻倍输出否则输出0
void solve()
{
int n ;
scanf("%d",&n) ;
if ( n % 10 == 0 ) printf("0") ;
else printf("%d",n*2) ;
}
I 神秘门的密码
题目大意 : 如果输入的字符串长度为奇数则输出123456否则输出前一半字符串和后一半字符串反转后二者拼接得到的字符串
void solve()
{
string s ;
cin >> s;
if ( s.size() & 1 )
{
cout << "123456" ;
}
else
{
string l = s.substr(0,s.size()/2) , r = s.substr(s.size()/2) ;
reverse(r.begin(),r.end());
cout << l + r ;
}
}
J 安全验证
题目大意 : 给一个字符串判断能不能找个真字串满足是前后缀且也出现在中间
调用string::find 、 algorithm库 search函数 、手写一个朴素匹配 均可通过
再者哈希二分、KMP、exKMP也可
#include <bits/stdc++.h>
using namespace std ;
bool Find(string a,string b) // 朴素匹配
{
for(int i = 0 ; i < a.size() - b.size() + 1; i++ )
{
for(int j = i , p = 0 ; p < b.size() ; j++ , p++ )
{
if (a[j] != b[p]) break ;
if (p == b.size() - 1) return true ;
}
}
return false ;
}
int main()
{
string str ;
cin >> str ;
string S = str.substr(1,str.size()-2) , s = "";
for(int i = 0 ; i < str.size() / 2 ; i++ )
{
bool flag = true ;
s += str[i] ;
for(int j = str.size() - i - 1 , k = 0 ; j < str.size() ; j ++ , k++ )
{
if ( str[j] != str[k] )
{
flag = false ;
break ;
}
}
if ( flag && search(S.begin(),S.end(),s.begin(),s.end()) != S.end() )
{
cout << s ;
return 0 ;
}
}
puts("No");
return 0 ;
}
K 科学计数法
题目大意 : 将数表示成 a * $10^b$ 简写成 aEb
#include<bits/stdc++.h>
using namespace std;
void solve()
{
string s ;
cin >> s ;
if ( s.find(".") != s.npos )
{
int len = s.find(".") , num = 0 ;
string m = s.substr(len+1) ;
while ( m.size() && m.back() == '0' ) m.pop_back() ; //去除尾 0
for(auto v : m) num = num * 10 + v - '0' ;
if ( num != 0 )
{
if ( len == 1 )
{
cout << s ;
}
else
{
cout << s[0] << '.' << s.substr(1,len-1) + m << 'E' << len - 1 ;
}
return ;
}
else
{
s = s.substr(0,len) ;
}
}
//整数情况
int num = 0 , len = s.size() ;
string ss = s.substr(1) ;
while ( ss.size() && ss.back() == '0' ) ss.pop_back() ; //去除尾 0
for(auto v : ss) num = num * 10 + v - '0' ;
if ( len == 1 )
{
cout << s ;
}
else if ( num == 0 )
{
cout << s[0] << 'E' << len-1 ;
}
else
{
cout << s[0] << '.' << ss << 'E' << len-1 ;
}
}
int main( )
{
solve();
return 0;
}
L 旅行
统计每个结点入度即可,保证联通性 。
* 链
* 环
#include <bits/stdc++.h>
using namespace std ;
const int N = 1e5 + 10 , M = 1e5 + 10;
int f[N] , n , m , indegree[N] ;
int find(int x) { return f[x] == x ? x : f[x] = find(f[x]) ;}
void merge(int a,int b) { f[find(a)] = find(b) ;}
int main()
{
int t;
scanf("%d",&t);
while ( t-- )
{
scanf("%d %d",&n , &m) ;
memset(indegree,0,sizeof indegree);
for(int i = 1 ; i <= n ; i++ ) f[i] = i ;
while ( m-- )
{
int u , v ;
scanf("%d %d",&u,&v) ;
merge(u,v) ;
indegree[v] ++;
}
int count0 = 0, count1 = 0;
bool flag = true ;
for(int i = 1 ; i <= n ; i++ )
{
if ( indegree[i] == 0 ) count0 ++ ;
else if ( indegree[i] == 1) count1 ++ ;
if ( find(1) != find(i) ) flag = false ;
}
if ( flag && (count1 == n-1 && count0 == 1) ) puts("YES");
else puts("NO");
}
return 0 ;
}
M 小码哥搭建花圃
题目大意 : 给5个整数 判断能不能构成 正方形或矩形
#include<bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
void solve()
{
map<int,int>mp;
int x ;
for(int i = 1 ; i <= 5 ; i++ )
{
cin >> x ;
++mp[x] ;
}
if ( mp.size() > 3 ) puts("No") ;
else
{
int maxn =0 , sum = 0 ;
for(auto v : mp )
{
maxn = max ( maxn , v.second );
if ( v.second == 1 ) sum ++ ;
}
if ( maxn >= 4 ) puts("Square");
else if ( sum <= 1 ) puts("Rectangle") ;
else puts("No");
}
}
int main( )
{
solve();
return 0;
}