原题链接
给出圆周率前100位,有n组数据:每组有两个整数a,b分别表示该图案的周长的平方和面积的4倍。一个图形越接近圆,它的a/b的值就越接近 圆周率。找出最接近圆的一组,如果接近程度相同,则选择其中周长最小的那一个“圆”所对应的一组,输出该组的a,b
(该题数据范围需要用高精,如果用C++/C语言会很麻烦,Python中可以引用decimal库,这样可以简化运算。我不会python,也是写这道题才接触,注释可能写的有点问题,代码是能过的,代码记得选python3)
import decimal from decimal import *//导入Python中decimal模板 getcontext().prec=40//.prec用来设置精度,这里设置为40位 pi=decimal.Decimal("3.1415926535897932384626433832795028841971")//pi为Decimal类型,给pi赋值, ans,d=(0,0),pi//将(0,0)赋值给ans,pi赋值给d for i in range(int(input()))://循环,从0,循环到输入数字-1 p, a = list(map(int, input().split()))//将输入的数分别赋给p,a代表分子和分母 dis=abs(decimal.Decimal(decimal.Decimal(p)/decimal.Decimal(a))-pi)//求思路中所说与圆周率的接近程度 if dis==d://比较接近程度 if p 原题链接
t组询问,每组询问一个整数n,输出n个圆(半径可以不同)可以分割的最大区域数
#include using namespace std; #define int long long #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); double a[1000005]; void solve() { int n,x; cin>>n; while(n--) { cin>>x; if(x==0) cout<<"1"<<" "; else cout<<2+((x-1)*x)<<" "; } cout< IOS int t=1; while(t--) { solve(); } return 0; } 任意选择两个数字作为左右区间进行异或,找到使得序列中所有元素全部变为0的最小操作次数
由于相同数字异或后结果为0,所以需要操作数加一需要满足:当前数字与前一个数字不同并且不为0,遍历数组得到最小操作数
(赛时咋没发现这道题呢。。。)
#include using namespace std; #define int long long #define endl "\n" #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); int a[1000010]; void solve() { int n; cin>>n; int sum=0; a[0]=-1; for(int i=1;i<=n;i++) { cin>>a[i]; if(a[i]==0) continue; if(a[i]!=a[i-1]) sum++; } cout< IOS int t=1; while(t--) { solve(); } return 0; } 原题链接
给出整数T代表T次询问,接下来T行:每行两个整数x,y,求出对x进行y次累加操作,其二进制下每位发生改变的总次数
#include using namespace std; #define int long long #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); #include int a[2000010]; bitset<64>p,q,r; int x,y,w=0; void solve() { cin>>x>>y; cout< IOS int t=1; cin>>t; p=0; for(int i=1;i<=2000010;i++) { q=i; r=p^q; w+=r.count(); a[i]=w; p=q; } while(t--) { solve(); } return 0; } 原题链接
输入两个矩阵,将第一个矩阵覆盖第二个矩阵的每一个可以容纳它的部分,对应的值相乘的和为所得矩阵对应位置的值,所得矩阵大小为(m-n+1)*(m-n+1),然后输出即可。
这是一道模拟题
#include using namespace std; //#define int long long #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); int a[30][30],b[30][30],c[30][30]; void solve() { int n,m; cin>>n>>m; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cin>>a[i][j]; } } for(int i=1;i<=m;i++) { for(int j=1;j<=m;j++) { cin>>b[i][j]; } } int x=1,y=1,p=0,q=0,w,u; int st=(m-n+1)*(m-n+1); while(st--) { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { c[x][y]+=a[i][j]*b[i+p][j+q]; w=i+p,u=j+q; } } cout< x++;y=1; } if(u==m) { q=0; p++; } else q++; } return; } int main() { IOS int t=1; while(t--) { solve(); } return 0; } 原题链接
这个题目有点长,先顺一遍题目吧:
我们需要查询的进行检验:
这道题是字符串模拟
#include using namespace std; #define int unsigned long long #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); #define endl "\n" mapmp1; void solve() { int m,n,q,a,b,c; string s1,s2,s3,s4,s5; cin>>m>>n>>q; while(m--) { cin>>s1>>s2; mp1[s2]=s1; } map >mp2; map >mp3; for(int i=1;i<=n;i++) { cin>>s3>>a; for(int j=1;j<=a;j++) { cin>>s4; mp2[s3].push_back(s4); cin>>b; for(int k=1;k<=b;k++) { cin>>s5; mp3[s4].push_back(s5); } } } for(int i=1;i<=q;i++) { int r=0; string x,y,z; cin>>x>>y>>z; for (auto t : mp2[y]) { if(t==x) { r=1; break; } } if(r==0) cout<<"No"< string w=mp1[z]; int u=0; for(auto s:mp3[x]) { if(s==w) { u=1; break; } } if(u==0) cout<<"No"< IOS int t=1; while(t--) { solve(); } return 0; }