1.门派制作
#include
int main()
{
int count = 0;
for (int i = 1; i {
for (int j=i;j > 0; j=j / 10)
{
if (j % 10 == 2)
{
count += 1;
printf(“%d “, i);
}
}
}
printf(“%d”, count);
}
2.既约分数
#include
//gcd函数求最大公约数
int gcd(int a, int b)
{
if (a % b == 0)
{
return b;
}
else
{
return gcd(b, a % b);
}
}
int main()
{
int count = 0;
for (int i = 1; i {
for (int j = 1; j {
if (gcd(i, j) == 1)
{
count += 1;
}
}
}
printf(“%d”, count);
}
3.蛇形填数
#include
using namespace std;
int a[50][50];
int main(){
/*
这里分奇数偶数情况讨论
*/
int id=0;//要填的数
for(int i=1;i for(int j=0;j {
if(i&1){ //奇数
a[i-j][j+1]=++id;
}
else{
a[j+1][i-j]=++id;
}
}
}
cout return 0;
}
4.跑步锻炼
#include
using namespace std;
int month[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int main() {
//初始化日期
int y = 2000, m = 1, d = 1, w = 6, ans = 0;
while (true) {
//千米书累加
ans += (d == 1 || w == 1) + 1;
if (y == 2020 && m == 10 && d == 1) {
break;
}
//日期天数递增
w =( w + 1 ) % 7;
d = d + 1;
//天数循环,月数加一
if(( y % 400 == 0 || y % 4 == 0 && y % 100 != 0 ) && m == 2){//闰年且为二月
if (d > month[m] + 1) {
d = 1;
m += 1;
}
}else if (d > month[m]) {
d = 1;
m += 1;
}
//月份循环,年数加一
if (m == 13) {
y += 1;
m = 1;
}
}
printf(“%dn”, ans);
return 0;
}
5.七段码
#include
using namespace std;
const int N=10;
int use[N],ans,e[N][N],fa[N];
void init(){
//连边建图
//a b c d e f g
//1 2 3 4 5 6 7
e[1][2]=e[1][6]=1;
e[2][1]=e[2][7]=e[2][3]=1;
e[3][2]=e[3][4]=e[3][7]=1;
e[4][3]=e[4][5]=1;
e[5][4]=e[5][6]=e[5][7]=1;
e[6][1]=e[6][5]=e[6][7]=1;
}
int find(int u){if(fa[u]==u)return u;fa[u]=find(fa[u]);return fa[u];}//并查集
void dfs(int d){
if(d>7){
/* 并查集判联通 */
for(int i=1;i for(int i=1;i for(int j=1;j if(e[i][j]&&use[i]&&use[j]){
int fx=find(i),fy=find(j);
if(fx!=fy){
fa[fx]=fy;
}
}
int k=0;
for(int i=1;i if(k==1)ans++;
return;
}
use[d]=1;
dfs(d+1);
use[d]=0;
dfs(d+1);
}
int main(){
init();
dfs(1);
cout }
7.成绩统计
#include
using namespace std;
int a;
int sum1,sum2;
char s=’%’;
int main()
{
// 请在此输入您的代码
int n;
scanf(“%d”,&n);
for(int i=1;i scanf(“%d”,&a);
if(a>=60) sum1++;
if(a>=85) sum2++;
}
float s1=100.0*sum1/n;
float s2=100.0*sum2/n;
printf(“%.0f%cn%.0f%c”,s1,s,s2,s);
return 0;
}
8.回文日期
#include
using namespace std;
int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
//check函数用来检查得到的日期是否合法
bool check(int date)
{
int year = date/10000;
int month = (date/100)%100;
int day = date%100;
if(month 12) return false;
if(day == 0 || month != 2 && day > days[month]) return false;
if(month==2)
{
int leap = year%4==0&&year%100!=0||year%400==0;
if(day>days[month]+leap) return false;
}
return true;
}
int main()
{
int N;
int date1,date2;
cin>>N;
int year = N/10000;
for(int i=year;;++i)
{
date1=i;
int x=i;
for(int j=0;j {
date1 = date1*10+x%10;
x/=10;
}
if(date1>N&&check(date1))
{
cout break;
}
}
int ab=N/1000000;
for(int i=ab;;++i)
{
int a=i/10;
int b=i%10;
int x=b*10+a;
date2 = i*1000000+ i*10000 +x*100 +x;
if(date2>N&&check(date2))
{
cout break;
}
}
return 0;
}
9.子串分支和
#include
#include
#include
#define ll long long
using namespace std;
const int maxn=2e5+10;
ll ans;//总个数->定义为long long ,否则会爆
int id[30][maxn];//每个字母的id 对应的位置
int cnt[30];//字母id 对应的数量
char a[maxn];//定义字符数组
int b[30];//各个字符区间段位置
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>a+1; //记得加1
int len=strlen(a+1);
// cout for(int i=1;i {
id[a[i]-‘a’][++cnt[a[i]-‘a’]]=i;//字母出现的最后位置
}
for(int i=1;i {
int front=0;//统计不同字符数
for(int j=0;j {
if(id[j][cnt[j=i)//这个字母在i后面
{
int t=lower_bound(id[j],id[j]+1+cnt[j],i)-id[j];//就是二分查找
b[++front] =id[j][t];//不同字符出现的第一个位置
}
}
sort(b+1,b+1+front);//对i后面出现的字母排一下序
int last=i;//当前正在索引的位置
for(int j=2;j其实这里就是第几个不同字符
{
ans+=(b[j]-last)*(j-1);
//b[j]-last是该位字母去上一个字母=距离差 ->其实就是有几个重复的这样的块
//然后再 * 这个块的长度,当前字符位置-1,其实就是对前面的做处理
//只是需要当前这个字符做标志,j-1是除去当前字符,然后将(b[j]-last)个段 *(前面不同字符个数j-1);
last=b[j];//将索引位置更新
}
ans+=(len-last+1)*front; //最后的位置,就是最长的一个段;
}
cout return 0;
}
10.平面切分
#include
using namespace std;
long double s[1010][2];//存储直线的A,B
long long ans;
bool st[1010]; //false表示不是重边
pair
int main(){
int n;
cin>>n;
for(int i=0;i
set
for(int j=0;j if(st[j])continue;//直线是重边,跳过
if(s[i][0]==s[j][0]){//两条直线斜率相等时,判断是平行还是重合
if(s[i][1]==s[j][1]){
st[i]=true;//待添加直线是重边,退出循环
break;
}else continue;//直线平行,不需要计算交点
}
p.first=(s[j][1]-s[i][1])/(s[i][0]-s[j][0]);//交点的x坐标
p.second=s[i][0]*p.first+s[i][1];//交点的y坐标
points.insert(p);
}
if(!st[i])ans+=points.size()+1;//若当前直线不是重边,更新答案
}
cout return 0;
}
11.子串排序
#include
#include
#include
using namespace std;
const int N = 135, M = 10010;
int f[N][30][N];
//chcnt[i][j]记录第i个位置取字母j+’a’的逆序对最大值
int chcnt[N][30];
//mlen[i]记录每个位置的最大值
int mlen[N];
void dp()
{
for (int i = 2; i {
int m = 0;
for (int j = 1; j {
for (int k = 1; k {
if (k > 1) f[i][j][k] = f[i – 1][j][k – 1] + i – k;
else f[i][j][k] = chcnt[i – 1][j – 1] + i – 1;
chcnt[i][j] = max(chcnt[i][j], f[i][j][k]);
}
m = max(m, chcnt[i][j]);
}
mlen[i] = m;
}
}
int main()
{
dp();
int score = 0;
cin >> score;
//找出最短长度值
int beg = 0;
for (int i = 1; i if (mlen[i] >= score)
{
beg = i;
break;
}
int curr = 0; //用于记录逆序值
int same = 1; //记录后缀中有多少个相同字母
char last = ‘z’ + 1;//记录上一个字母是什么
for (int i = beg; i > 0; –i)
{
//从a开始枚举
int j = 0;
for (; j {
if (j == last – ‘a’) curr -= same;
if (curr + chcnt[i][j] >= score)
{
curr += i – 1;
break;
}
}
if (j == last – ‘a’) same++;
else
{
last = j + ‘a’;
same = 1;
}
cout }
cout
return 0;
}
文章知识点与官方知识档案匹配,可进一步学习相关知识算法技能树首页概览33962 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!