工作时长
#include<bits/stdc++.h>
using namespace std;
int main()
{
freopen("records.txt","r",stdin);//将标准输入流stdin重定向到名为"records.txt"的文件,从这个文件读取输入
int n,y,r,s,f,m;
vector<int> days={0,31,28,31,30,31,30,31,31,30,31,30,31};
vector<int> num;
while(scanf("%d-%d-%d %d:%d:%d",&n,&y,&r,&s,&f,&m)== 6){//保证读入6个数,否则结束输入
int t=0;
for(int i=0;i<y;i++){
t+=days[i];
}
t+=r;
t=t*24+s;
t=t*60+f;
t=t*60+m;
num.push_back(t);
}
sort(num.begin(),num.end());
int sum=0;
for(int i=0;i<num.size();i=i+2){
sum=sum+num[i+1]-num[i];
}
printf("%d",sum);
return 0;
}
与或异或
#include <iostream>
using namespace std;
int main()
{
int arr[5][5];
arr[0][0]=1;
arr[0][1]=0;
arr[0][2]=1;
arr[0][3]=0;
arr[0][4]=1;
int sum=0;
int n=59049;//3^10,三进制,枚举所有情况
for(int q=0;q<n;q++){
int w=q;
for(int i=1;i<=4;i++){
for(int j=0;j<5-i;j++){
int op=w%3;
w=w/3;
switch(op){
case 0:arr[i][j]=arr[i-1][j]&arr[i-1][j+1];break;
case 1:arr[i][j]=arr[i-1][j]|arr[i-1][j+1];break;
case 2:arr[i][j]=arr[i-1][j]^arr[i-1][j+1];break;
}
}
}
if(arr[4][0]==1)sum++;
}
printf("%d",sum);
return 0;
}
翻转
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
int i=0;
cin>>n;
while(i<n){
i++;
string t,s;
int m,q=0;
cin>>t;
cin>>s;
m=t.size();
for(int j=1;j<m-1;j++){//将T中000或者111的对应S判断一下,假如是101或者010就换过来
if(t[j]==t[j-1]&&t[j]==t[j+1]){
if(s[j]!=s[j-1]&&s[j]!=s[j+1]){
s[j]=s[j+1]=s[j-1]=t[j];
q++;
}
}
}
int pd=0;
for(int j=0;j<m;j++){
if(t[j]!=s[j]){
pd=1;
break;
}
}
if(pd==0){
cout<<q<<endl;
}
else{
cout<<"-1"<<endl;
}
}
return 0;
}
阶乘的和
意思是的最大因数为m!,求m。
=(A1!+A2!+..+An!)=min(A1!,A2!,..,An!)*b=m!*b
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
int s[100010];
cin>>n;
for(int i=0;i<n;i++){
cin>>s[i];
}
sort(s,s+n);
int x=s[0];
int y=0;
for(int i=0;i<n;i++){//枚举所有情况,这个方法比较麻烦
if(s[i]==x){
y++;
}
else{
if(y%(x+1)!=0){
cout<<x<<endl;
return 0;
}
else{
while(y%(x+1)==0&&y&&x!=s[i]){
y=y/(x+1);
x++;
}
if(x==s[i]){
y++;
}
else{
cout<<x<<endl;
return 0;
}
}
}
}
while(y%(x+1)==0&&y){
y=y/(x+1);
x=x+1;
}
cout<<x<<endl;
return 0;
}
公因数匹配
#include<bits/stdc++.h>
using namespace std;
int N=1000010;
map<int,vector<int>> v;
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){//一个数是由若干质数相乘组成,找出所有数的质数
int x;
cin>>x;
for(int j=2;j<=x/j;j++){
if(x%j==0){
while(x%j==0){
x=x/j;
}
v[j].push_back(i);
}
}
if(x>1){
v[x].push_back(i);
}
}
int f=n+1,l=n+1;
for(auto [x,y]:v){//找出质数中最小的那组
if(y.size()>=2){
if(y[0]<f){
f=y[0];
l=y[1];
}
else if(y[0]==f){
if(y[1]<l){
l=y[1];
}
}
}
}
cout<<f<<" "<<l<<endl;
return 0;
}
子树的大小
规律
a
a*3-1 a*3 a*3+1
(a*3-1)*3-1 ... (a*3+1)*3+1
a
a*2 a*2+1
a*2*2 ... (a*2+1)*2+1
m=2,3...
a
a*m-m+2 ... a*m+1
(a*m-m+2)*m-m+2 ... (a*m+1)*m+1
#include<bits/stdc++.h>
using namespace std;
int main(){
long long T,n,m,k;
cin>>T;
for(int i=1;i<=T;i++){
cin>>n>>m>>k;
long long sum=0;
long long kl=k,kr=k;
while(kr<=n){
if(kr<=n){
sum=sum+kr-kl+1;
}
kl=kl*m-m+2;
kr=kr*m+1;
}
if(kr>n&&kl<=n){
sum=sum+n-kl+1;
}
cout<<sum<<endl;
}
return 0;
}