1 .分数
用等差数列求和公式算出来再模拟
#include<bits/stdc++.h>
using namespace std;
int main(){
int len=1;
int sum=1;
for(int i=1;i<20;i++){
len*=2;
sum+=len;
}
printf("%d/%d",sum,len);
}
2.星期一
可以查询日期,也可以通过当前日期推算
#include<bits/stdc++.h>
using namespace std;//2001年一月一日星期一
int main(){
cout<<(365*100+25)/7;
}
3.第几个幸运数
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=59084709587505;
int main(){
int a[3]={3,5,7};
ll t=1;
set<ll>s;
while(1){
for(int i=0;i<3;i++){
ll tt=t*a[i];
if(tt<=maxn){
s.insert(tt);
}
}
t=*(s.upper_bound(t));
if(t>=maxn) break;
}
cout<<s.size()<<endl;
}
4.航班时间
#include<bits/stdc++.h>
using namespace std;
int gettime(){
char s[30];
cin.getline(s,30);
int h1,m1,s1,h2,m2,s2,d=0;
if(strlen(s)<=17){
sscanf(s,"%d:%d:%d %d:%d:%d",&h1,&m1,&s1,&h2,&m2,&s2);
}
else{
sscanf(s,"%d:%d:%d %d:%d:%d (+%d)",&h1,&m1,&s1,&h2,&m2,&s2,&d);
}
return d*24*3600+h2*3600+m2*60+s2-(h1*3600+m1*60+s1);
}
int main(){
int n;
cin>>n;
getchar();
for(int i=0;i<n;i++){
int time1=gettime();
int time2=gettime();
int t=(time1+time2)/2;
int h=t/3600;
int m=t%3600/60;
int s=t%60;
printf("%02d:%02d:%02d\n",h,m,s);
}
}
5.全球变暖
连通块加深搜,然后用一个数组记录周围有没有海洋,如果没有就记录.
#include<bits/stdc++.h>
using namespace std;
char a[2000][2000];
int visit[2000][2000];
int dir[4][2]={{1,0},{0,1},{0,-1},{-1,0}};
int ans[20000];
int cnt2;
int cnt1=0;
int n;
void dfs(int x,int y){
if(x>=n||x<0||y>=n||y<0) return;
int flag=1;
for(int i=0;i<4;i++){
int dx=x+dir[i][0];
int dy=y+dir[i][1];
if(a[dx][dy]=='.'){
flag=0;
}
}
if(a[x][y]=='#'&&flag) ans[cnt1]++;
for(int i=0;i<4;i++){
int dx=x+dir[i][0];
int dy=y+dir[i][1];
if(dx>=0&&dx<n&&dy>=0&&dy<n&&!visit[dx][dy]){
if(a[dx][dy]=='#'){
visit[dx][dy]=1;
dfs(dx,dy);
}
else if(a[dx][dy]=='.'){
a[x][y]='@';
}
}
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>a[i][j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(a[i][j]=='#'&&!visit[i][j]){
cnt1++;
visit[i][j]=1;
dfs(i,j);
if(ans[cnt1]) cnt2++;
}
}
}
cout<<cnt1-cnt2<<endl;
}
6.倍数问题
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<ll>v[2000000];
bool cmp(ll a,ll b){
return a>b;
}
int main(){
ll n,k,t,sum,maxn=0;
cin>>n>>k;
for(ll i=0;i<n;i++){
cin>>t;
v[t%k].push_back(t);
}
for(ll i=0;i<k;i++){
sort(v[i].begin(),v[i].end(),cmp);
}
for(ll i=0;i<k;i++){
for( ll j=0;j<k;j++){
t=(k-(i+j)%k)%k;
sum=0;
if(v[i].size()&&v[j].size()&&v[t].size()){
if(j!=i&&i!=t&&t!=j){
sum=v[i][0]+v[j][0]+v[t][0];
}
else if(j==i&&i!=t){
if(v[i].size()==1)continue;
sum=v[i][0]+v[i][1]+v[t][0];
}
else if(j==t&&i!=t){
if(v[j].size()==1)continue;
sum=v[j][0]+v[j][1]+v[i][0];
}
else if(i==t&&j!=t){
if(v[i].size()==1)continue;
sum=v[i][0]+v[i][1]+v[j][0];
}
else {
if(v[i].size()<=2)continue;
sum=v[i][0]+v[i][1]+v[i][2];
}
}
if(sum>maxn)maxn=sum;
}
}
cout<<maxn<<endl;
}
7.乘积尾0
计算这些数共有多少因子2和因子5,然后取最小
#include<bits/stdc++.h>
using namespace std;
int main(){
int sum2=0;
int sum5=0;
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
int a;
cin>>a;
while(a%5==0){
a/=5;
sum5++;
}
while(a%2==0){
a/=2;
sum2++;
}
}
}
cout<<min(sum2,sum5);
}
打印图形
其实这个我没太看懂,不过观察draw函数发现肯定要用那个size,然后把n改成2,试试size/1,size/2,size/3看那个和样例一样就可以了(抱歉我是菜鸟)
#include <stdio.h>
#include <stdlib.h>
void show(char* buf, int w){
int i,j;
for(i=0; i<w; i++){
for(j=0; j<w; j++){
printf("%c", buf[i*w+j]==0? ' ' : 'o');
}
printf("\n");
}
}
void draw(char* buf, int w, int x, int y, int size){
if(size==1){
buf[y*w+x] = 1;
return;
}
int n =size/3; //填空
draw(buf, w, x, y, n);
draw(buf, w, x-n, y ,n);
draw(buf, w, x+n, y ,n);
draw(buf, w, x, y-n ,n);
draw(buf, w, x, y+n ,n);
}
int main()
{
int N = 3;
int t = 1;
int i;
for(i=0; i<N; i++) t *= 3;
char* buf = (char*)malloc(t*t);
for(i=0; i<t*t; i++) buf[i] = 0;
draw(buf, t, t/2, t/2, t);
show(buf, t);
free(buf);
return 0;
}