门牌制作
模拟
#include<iostream>
using namespace std;
int main()
{
int a[10] = {0};
for(int i = 1 ; i <= 2020 ; i++ )
{
int k = i;
while(k)
{
//cout << k % 10 << endl;
a[k % 10]++;
k /= 10;
}
}
cout << a[2];
return 0;
}
既约分数
gcd 模拟
#include <iostream>
using namespace std;
int gcd(int a, int b)
{
return b?gcd(b, a % b):a;
}
int main()
{
int sum = 0;
for (int i = 1; i <= 2020; i++)
{
for (int j = 1; j <= 2020; j++)
{
if (gcd(i, j) == 1)
{
sum++;
}
}
}
cout << sum;
return 0;
}
蛇形填数
算一下
#include <iostream>
using namespace std;
int main()
{
cout << 761;
return 0;
}
七段码
算一下
#include <iostream>
using namespace std;
int main()
{
cout << 80 << endl;
return 0;
}
跑步训练
#include<iostream>
using namespace std;
int main() {
int weekday = 5, sum = 0;
for (int i = 2000; i <= 2019; i++)
{
int flag = 1;
if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0)) flag = 0;
int a[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
if (!flag) a[1] = 29;
for (int j = 1; j <= 12; j++) {
for (int k = 1; k <= a[j - 1]; k++)
{
weekday++;
if ((weekday == 1 && k != 1) || (weekday != 1 && k == 1) || (weekday == 1 && k == 1)) sum += 2;
else sum++;
if (weekday == 7) weekday = 0;
}
}
}
//2020年
int b[9] = { 31,29,31,30,31,30,31,31,30 };
for (int i = 1; i <= 9; i++)
{
for (int k = 1; k <= b[i - 1]; k++)
{
weekday++;
if ((weekday == 1 && k != 1) || (weekday != 1 && k == 1) || (weekday == 1 && k == 1)) sum += 2;
else sum++;
if (weekday % 7 == 0) weekday = 0;
}
}
sum += 2;
cout << sum;
}
成绩统计
#include <iostream>
using namespace std;
int main()
{
int n, s;
cin >> n;
int sum1 = 0, sum2 = 0;
for (int i = 0; i < n; i++)
{
cin >> s;
if (s >= 60) sum1++;
if (s >= 85) sum2++;
}
int a, b;
if ((double)sum1 / n * 100 - (int)((double)sum1 / n * 100) >= 0.5) a = (int)((double)sum1 / n * 100) + 1;
else a = (int)((double)sum1 / n * 100);
if ((double)sum2 / n * 100 - (int)((double)sum2 / n * 100) >= 0.5) b = (int)((double)sum2 / n * 100) + 1;
else b = (int)((double)sum2 / n * 100);
cout << a << "%" << endl << b << "%" << endl;
return 0;
}
回文日期
一个对一个错
#include <iostream>
#include <cmath>
using namespace std;
bool c1(int n3, int n4)
{
int t;
if (n4 / 100 == 1 || n4 / 100 == 3 || n4 / 100 == 5 || n4 / 100 == 7 || n4 / 100 == 8 || n4 / 100 == 10 || n4 / 100 == 12)
{
t = 31;
}
else if (n4 / 100 == 4 || n4 / 100 == 6 || n4 / 100 == 9 || n4 / 100 == 11)
{
t = 30;
}
else if (n3 % 400 == 0 || (n3 % 100 != 0 && n3 % 4 == 0) && n4 / 100 == 2)
{
t = 29;
}
else
{
t = 28;
}
//cout << t << " " << n4 / 100 << " " << n4 % 100 << " ";
if (n4 / 100 <= 12 && n4 % 100 <= t && n4 / 100 >= 1 && n4 % 100 >= 1)
{
return true;
}
return false;
}
int q(int n3)
{
return n3 % 10 * 1000 + n3 / 10 % 10 * 100 + n3 / 100 % 10 * 10 + n3 / 1000 % 10;
}
bool c2(int n)
{
if (q(n / 10000) == n % 10000)
{
return true;
}
return false;
}
bool c3(int n)
{
if (n / 1000000 == n % 1000000 / 10000 && n / 1000000 / 10 != n / 1000000 % 10)
{
return true;
}
return false;
}
//int n3;
//n3 = n1;
//int n4;
//n4 = n3 % 10 * 1000 + n3 / 10 % 10 * 100 + n3 / 100 % 10 * 10 + n3 / 1000 % 10;
//int n5 = n / 1000000;
//int n6 = n5 / 10 + n5 % 10 * 10;
//n3 = n5 * 1000000 + n5 * 10000 + n6 * 100 + n6;
int main()
{
int t;
cin >> t;
while (t--)
{
string s;
cin >> s;
int a[10];
for (int i = 0; i < 8; i++)
{
a[i] = s[i] - '0';
}
int n = 0, p = 1;
for (int i = 7; i >= 0; i--)
{
n += a[i] * p;
p *= 10;
}
int n1, n2, n3, n4;
n1 = n / 10000;
int flag1 = 0, flag2 = 0;
//cout << n1 << " " << q(n1) << " ";
if (n1 * 10000 + q(n1) > n && c1(n1, q(n1)))
{
flag1 = 1;
n3 = n1 * 10000 + q(n1);
if (c3(n3))
{
flag2 = 1;
n4 = n3;
}
}
n1++;
while (1)
{
n2 = q(n1);
if (c1(n1, n2) && flag1 == 0)
{
if (c2(n1 * 10000 + n2) && n1 * 10000 + n2 != n)
{
n3 = n1 * 10000 + n2;
flag1 = 1;
}
}
if (c1(n1, n2) && flag2 == 0)
{
if (c2(n1 * 10000 + n2) && c3(n1 * 10000 + n2) && n1 * 10000 + n2 != n)
{
n4 = n1 * 10000 + n2;
flag2 = 1;
}
}
if (flag1 == 1 && flag2 == 1)
{
break;
}
n1++;
}
cout << n3 << endl << n4 << endl;
}
return 0;
}
子串分值和
对于字符串s中的每一个字符,对这个字符左右分别求左边右边包含它的子串个数和,保存上一次该子串在的位置防止重复求子串个数
#include<iostream>
using namespace std;
int last[26];
int main(){
string s;
cin >> s;
int len = s.size();
s = "0" + s;
long long int ans=0;
for(int i = 1; i < s.size(); i++)
{
ans += (i - last[s[i]-'a']) * (len - i + 1);
last[s[i]-'a'] = i;
}
cout << ans;
return 0;
}
平面切分
set 不充分的切线加入 不重复的切线加入会增加一个面 再求有多少交点加上交点数
#include<iostream>
#include<set>
using namespace std;
typedef pair<double, double> k;
set<k> l;
int res = 1;
int cmp(double c, double d)
{
set<k> p;
k t;
for (auto i = l.begin(); i != l.end(); i++)
{
double a = i->first;
double b = i->second;
if (a != c)
{
t.first = (d - b) / (a - c);
t.second = c * t.first + d;
p.insert(t);
}
}
return p.size();
}
int main()
{
int n;
cin >> n;
while (n--)
{
double a, b;
cin >> a >> b;
int t1 = l.size();
l.insert({ a,b });
if (l.size() != t1)
{
res++;
res += cmp(a, b);
}
}
cout << res << endl;
return 0;
}