1.含2天数(20年国赛——3月16日)
思路:这一天的年月日中只要有一个2即符合条件
#include <iostream>
using namespace std;
bool isyear(int x)
{
return (x % 400 == 0 || x % 4 == 0 && x % 100 != 0);
}
bool check(int n)
{
while(n)
{
if(n % 10 == 2)
return true;
n /= 10;
}
return false;
}
int main()
{
int cnt = 0;
for(int i = 1900; i <= 9999; i ++)//枚举年份
{
if(check(i)) //年份包含2
{
if(isyear(i)) cnt += 366;
else cnt += 365;
}
else
{
if(isyear(i))
cnt += 180;//每个月含2天数 + 2月 + 12月
else
cnt += 179;
}
}
cout << cnt << endl;
return 0;
}
2.蓝桥幼儿园(3月21日)
OP 判定
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5+10;
int fa[MAXN];
void init(int n){
for(int i=1;i<=n;i++){
fa[i] = i;
}
}
int find(int x){
return x==fa[x] ? fa[x] : (fa[x]=find(fa[x]));
}
void merge(int x,int y){
int fx = find(x);
int fy = find(y);
if(fx!=fy){
fa[fx] = fy;
}
}
int main()
{
int n,m;
cin >> n >> m;
init(n);
for(int i=0;i<m;i++){
int t,x,y;
cin >> t >> x >> y;
if(t==1){
merge(x,y);
}else{
if(find(x)==find(y)){
cout << "YES" << endl;
}else{
cout << "NO" << endl;
}
}
}
}
3.七星填数(16年国赛——3月27日)
暴力就完事了
#include <iostream>
#include <algorithm>
using namespace std;
int a[11]={1,2,3,4,5,7,8,9,10,12,13};
int main()
{
do{
int sum=a[0]+a[1]+a[2]+a[3];
if(6+a[2]+a[5]+11==sum&&6+a[1]+a[4]+14==sum&&a[0]+a[4]+a[6]+a[9]==sum&&a[3]+a[5]+a[7]+a[10]==sum
&&14+a[6]+a[8]+a[10]==sum&&a[9]+a[8]+a[7]+11==sum){
printf("%d %d %d %d",a[0],a[1],a[2],a[3]);
}
}while(next_permutation(a,a+11));
return 0;
}
4.日志统计(18年省赛——3月13日)
该题为二刷题,解题思路与第一次做一致,所以就直接上代码了
#include<cstdio>
#include<algorithm>
using namespace std;
int n,d,k;
int nowlike[100005];
struct node{
int ts;
int id;
};
node arr[100005];
bool ishot[100005];
bool cmp(node x,node y)
{
return x.ts<y.ts;
}
int main()
{
scanf("%d%d%d",&n,&d,&k);
for(int i=1;i<=n;i++)
scanf("%d%d",&arr[i].ts,&arr[i].id);
sort(arr+1,arr+1+n,cmp);
int l = 1;
for(int i=1;i<=n;i++)
{
nowlike[arr[i].id]++;
while(arr[i].ts >= arr[l].ts + d) nowlike[arr[l++].id]--;
if(nowlike[arr[i].id]>=k) ishot[arr[i].id] = true;
}
for(int i=0;i<=100005;i++)
if(ishot[i])
printf("%d\n",i);
return 0;
}
5.子串分值
#include <iostream>
#include <vector>
using namespace std;
vector<int> pos[26];
int main() {
string s;
cin >> s;
int lgh = s.length();
for(int i = 0; i < lgh; i++) {
int index = s[i] - 'a';
if(!pos[index].size()) pos[index].push_back(-1);
pos[index].push_back(i);
}
for(int i = 0; i < 26; i++)
if(pos[i].size()) pos[i].push_back(lgh);
long long ans = 0;
for(int i = 0; i < 26; i++)
if(pos[i].size())
for(int j = 1; j < pos[i].size() -1; j++)
ans += (pos[i][j] - pos[i][j - 1] - 1) + (pos[i][j + 1] - pos[i][j] -1)
+ 1ll * (pos[i][j] - pos[i][j - 1] - 1) * (pos[i][j + 1] - pos[i][j] - 1);
ans += lgh;
cout << ans << endl;
return 0;
}
6.小数第N位
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#define ll long long
using namespace std;
int b;
long long qpow(ll base,ll num)
{
long long ans=1,r=1;
while(num)
{
if(num&1)
{
ans=base*ans%(b*1000);
}
num>>=1;
base=base*base%(b*1000);
}
return ans;
}
int main()
{
ll a,c;
cin>>a>>b>>c;
cout<<(a*qpow(10,c+2)%(b*1000)/b);
return 0;
}