门牌制作
暴力跑一遍存一下答案,最后输出624即可
既约分数
把分子分母分别枚举,判断分子分母gcd值是否为1
#include<iostream>
using namespace std;
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
int main()
{
int ans=0;
for(int i=1;i<2021;i++)
{
for(int j=1;j<2021;j++)
{
if(gcd(i,j)==1) ans++;
}
}
cout<<ans-1<<endl;
}
蛇形填数
模拟即可,或者也可以观察1 1到2 2 到3 3 的路径,发现规律,不过这种方法的代码忘记保存了
#include<iostream>
using namespace std;
int a[50][50];
int main()
{
int num=0;
for(int i=1;i<=40;i++)
{
if(i%2==1)
for(int j=i,k=1;j>=1;j--,k++)
a[j][k]=++num;
else
for(int j=1,k=i;k>=1;k--,j++)
a[j][k]=++num;
}
cout<<a[20][20]<<endl;
}
七段码
并差集加dfs
用二维数组把不同灯管之间相邻的关系表示出来,dfs暴力跑出所有情况,判断每一种情况是否满足灯亮且满足二维数组所存的相邻关系,存在就存进并查集,最后检查并查集是否只有一个即可
#include<iostream>
using namespace std;
const int N = 10;
int used[N], fa[N];
int ne[N][N];
int m, ans;
int find(int x)
{
return fa[x] == x ? x : fa[x] = find(fa[x]);
}
void dfs(int n)
{
if (n > 7)
{
for (int i = 1; i <= m; i++) fa[i] = i;
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= m; j++)
{
if (used[i] && used[j] && ne[i][j])
{
int dx = find(i), dy = find(j);
if (dx != dy)
{
fa[dx] = dy;
}
}
}
}
int check = 0, last = 0;
for (int i = 1; i <= m; i++)
{
if (used[i])
{
if (last == 0)
{
last = find(i);
}
if (last != find(i))
{
check = 1;
break;
}
}
}
if (!check)
{
ans++;
//for (int i = 1; i <= m; i++)cout << used[i];
//puts("");
}
return;
}
used[n] = 1;
dfs(n + 1);
used[n] = 0;
dfs(n + 1);
}
void solve()
{
m = 7;
ne[1][2] = ne[1][6] = 1;
ne[2][1] = ne[2][3] = ne[2][7] = 1;
ne[3][7] = ne[3][2] = ne[3][4] = 1;
ne[4][3] = ne[4][5] = 1;
ne[5][4] = ne[5][6] = ne[5][7] = 1;
ne[6][5] = ne[6][7] = ne[6][1] = 1;
ne[7][6] = ne[7][5] = ne[7][3] = ne[7][6] = 1;
dfs(1);
cout << ans - 1 << endl;
}
int main()
{
solve();
}
跑步锻炼
按照题意模拟即可
#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
int ans;
int year, month, day, week;
int m[14];
void init()
{
m[1] = m[3] = m[5] = m[7] = m[8] = m[10] = m[12] = 31;
m[4] = m[6] = m[9] = m[11] = 30;
m[2] = 28;
}
int check()
{
return (year % 4==0 && year % 100 != 0 || year % 400==0);
}
void dayup()
{
if (check()) m[2] = 29;
else m[2] = 28;
day++;
if (day > m[month]) month++, day = 1;
if (month > 12) month = 1, year++;
week++;
if (week == 8) week = 1;
}
void solve()
{
init();
while (1)
{
ans += 1;
if (day == 1 || week == 1) ans += 1;
if (year == 2020 && month == 10 && day == 1)
{
cout << ans << endl;
return;
}
dayup();
}
}
signed main()
{
year = 2000, month = day = 1, week = 6;
solve();
}
回文日期
偷了个懒,用上一题代码暴力跑了所有年月日发现只有331个回文日期,所以就预先处理好,再进行判断了
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#define int long long
using namespace std;
int ans;
int year, month, day;
int m[14];
string b[350] = { "10011001","10100101","10111101","10200201","10211201","10300301","10400401","10500501","10600601","10700701","10800801","10900901","11011011","11100111","11111111","11200211","11211211","11300311","11400411","11500511","11600611","11700711","11800811","11900911","12011021","12100121","12111121","12200221","12211221","12300321","12400421","12500521","12600621","12700721","12800821","12900921","13011031","13100131","13211231","13300331","13500531","13700731","13800831","20011002","20100102","20111102","20200202","20211202","20300302","20400402","20500502","20600602","20700702","20800802","20900902","21011012","21100112","21111112","21200212","21211212","21300312","21400412","21500512","21600612","21700712","21800812","21900912","22011022","22100122","22111122","22200222","22211222","22300322","22400422","22500522","22600622","22700722","22800822","22900922","30011003","30100103","30111103","30200203","30211203","30300303","30400403","30500503","30600603","30700703","30800803","30900903","31011013","31100113","31111113","31200213","31211213","31300313","31400413","31500513","31600613","31700713","31800813","31900913","32011023","32100123","32111123","32200223","32211223","32300323","32400423","32500523","32600623","32700723","32800823","32900923","40011004","40100104","40111104","40200204","40211204","40300304","40400404","40500504","40600604","40700704","40800804","40900904","41011014","41100114","41111114","41200214","41211214","41300314","41400414","41500514","41600614","41700714","41800814","41900914","42011024","42100124","42111124","42200224","42211224","42300324","42400424","42500524","42600624","42700724","42800824","42900924","50011005","50100105","50111105","50200205","50211205","50300305","50400405","50500505","50600605","50700705","50800805","50900905","51011015","51100115","51111115","51200215","51211215","51300315","51400415","51500515","51600615","51700715","51800815","51900915","52011025","52100125","52111125","52200225","52211225","52300325","52400425","52500525","52600625","52700725","52800825","52900925","60011006","60100106","60111106","60200206","60211206","60300306","60400406","60500506","60600606","60700706","60800806","60900906","61011016","61100116","61111116","61200216","61211216","61300316","61400416","61500516","61600616","61700716","61800816","61900916","62011026","62100126","62111126","62200226","62211226","62300326","62400426","62500526","62600626","62700726","62800826","62900926","70011007","70100107","70111107","70200207","70211207","70300307","70400407","70500507","70600607","70700707","70800807","70900907","71011017","71100117","71111117","71200217","71211217","71300317","71400417","71500517","71600617","71700717","71800817","71900917","72011027","72100127","72111127","72200227","72211227","72300327","72400427","72500527","72600627","72700727","72800827","72900927","80011008","80100108","80111108","80200208","80211208","80300308","80400408","80500508","80600608","80700708","80800808","80900908","81011018","81100118","81111118","81200218","81211218","81300318","81400418","81500518","81600618","81700718","81800818","81900918","82011028","82100128","82111128","82200228","82211228","82300328","82400428","82500528","82600628","82700728","82800828","82900928","90011009","90100109","90111109","90200209","90211209","90300309","90400409","90500509","90600609","90700709","90800809","90900909","91011019","91100119","91111119","91200219","91211219","91300319","91400419","91500519","91600619","91700719","91800819","91900919","92011029","92100129","92111129","92200229","92211229","92300329","92400429","92500529","92600629","92700729","92800829","92900929"};
vector<string> a;
void init()
{
for (int i = 0; i < 331; i++) {
string str = b[i];
bool find = 1;
for (int j = 0; j <= 1; j++)
{
if (str[j] != str[j + 2]) find = 0;
}
if (find == 1) a.push_back(str);
}
}
signed main()
{
init();
int t;
cin >> t;
while (t--)
{
string str;
cin >> str;
//cout << str << endl;
for (int i = 0; i < 331; i++)
{
if (b[i] > str) {
cout << b[i] << endl;
break;
}
}
for (auto x : a)
{
if (x > str) {
cout << x << endl;
break;
}
}
}
}
成绩统计
注意四舍五入
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#define int long long
using namespace std;
void cal(double s)
{
int old = s;
s *= 10;
//cout << s << endl;
int g = s;
g %= 10;
if (g >= 5)old++;
cout << old << '%' << endl;
}
void solve()
{
int n;
cin >> n;
double ji = 0, you = 0;
double sum = n;
for (int i = 1; i <= n; i++)
{
int num;
cin >> num;
if (num >= 85) you++;
if (num >= 60) ji++;
}
double case1 = ji * 100 / sum, case2 = you * 100 / sum;
cal(case1);
cal(case2);
}
signed main()
{
solve();
}
子串分值和
数学,用贡献来描述一个字母对由它产生的字串的f值的影响,首先每一个字母都可以产生有它本身为第一位的连续子串,值为(n-i+1),例如a,ab,abc 这三个字串的f值里面都有a的贡献。
同时这些连续字串也可以作为后缀,与前面的字串结合,形成新的字串,例如bca,bcab,bcabc这三个字串的f值里面都有a的贡献,但是bca之前再加一个a (abca)就不可以算作后面那个a的贡献,而是第一次出现的字母a的贡献。
所以我们可以归纳出,一个连续字串的f值是由第一次出现的字母所贡献出来的,反过来,我们可以根据所给字母,构造出由它作为第一次出现的连续字串。
#include<iostream>
#include<cstring>
#include<map>
#include<set>
#define int long long
using namespace std;
const int N = 1e6 + 10;
int pre[30];
void solve()
{
string str;
cin >> str;
int n = str.length();
int ans = 0;
str = '0' + str;
for (int i = 1; i <= n; i++)
{
ans += (n - i + 1) * (i - pre[str[i] - 'a' + 1]);
pre[str[i] - 'a' + 1] = i;
}
cout << ans << endl;
}
signed main()
{
solve();
}
平面切分
每多一条直线就多至少一个平面。
多一条直线与当前之前所交的不重复点个数k就多k个平面
#include <iostream>
#include <set>
using namespace std;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
set<PII> s;
int main()
{
int res = 1;
int n;
cin >> n;
while (n--)
{
int a, b;
cin >> a >> b;
if (s.find({a, b}) != s.end())
continue;
res++;
set<PDD> jd;
for (auto it = s.begin(); it != s.end(); it++)
{
double x = (it->second - b) * 1.0 / (a - it->first);
double y = a * x + b;
if (a != it->first && jd.find({x, y}) == jd.end())
{
res += 1;
jd.insert({x, y});
}
}
s.insert({a, b});
}
cout << res << endl;
return 0;
}