Problem - 948B - Codeforces
思路:筛法求素数plus+一点点的思考,代码如下:
#include<bits/stdc++.h>
using namespace std;
#define maxn 1000006
int prime[maxn];
void db()
{
prime[0]=prime[1]=1;
for(int i=2;i<=maxn;i++)
if(!prime[i])
for(int j=i*2;j<maxn;j+=i)
prime[j]=i;
}
int main()
{
db();
int x0,x2;
cin>>x2;
x0=maxn;
for(int i=x2-prime[x2]+1;i<=x2;i++)
{
x0=min(i-prime[i]+1,x0);
}
cout<<x0<<endl;
return 0;
}
CodeForces - 1609A
思路:理清事情的本质,不要一拿到手就分情况,找相同点。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
scanf("%d", &t);
while (t--) {
int n, a, maxa = 0, cnt = 0;
long long ans = 0;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &a);
while (a % 2 == 0) cnt++, a /= 2;
maxa = max(maxa, a);
ans += a;
}
ans += maxa * ((1LL << cnt) - 1);
printf("%lld\n", ans);
}
return 0;
}
CodeForces - 1583A
思路:总体讲还比较简单,强调思考,脑子转一下谢谢
#include<bits/stdc++.h>
using namespace std;
const int N = 205;
int a[N];
bool isprime(int n)
{
for(int i=2;i<=n/i; ++i){
if(n%i==0){
return false;
}
}
return true;
}
int main()
{
int n;
int t;
cin>>t;
while(t--){
cin>>n;
int sum = 0;
for(int i=0; i<n; ++i){
cin>>a[i];
sum += a[i];
}
int tmp = 0,pos = -1;
for(int i=0; i<n; ++i){
if(isprime(sum)==false){
break;
}
if(isprime(sum-a[i])==false){
sum -= a[i];
tmp = 1;
pos = i;
}
}
if(tmp == 1){
cout<<n - 1<<endl;
for(int i=0; i<n; ++i){
if(pos==i){
continue;
}
cout<<i+1<<' ';
}
}
else{
cout<<n<<endl;
for(int i=0; i<n; ++i){
cout<<i+1<<' ';
}
}
cout<<endl;
}
return 0;
}
CodeForces - 500B
思路:用并查集把可以互相交换的数连起来,把同一集合中的数按从小到大排,再摆回对应的位置
#include<bits/stdc++.h>
using namespace std;
int fa[310],ans[310],c[310],d[310];
int n;
int b[310];
int find(int x){
if(x==fa[x]) return x;
return fa[x]=find(fa[x]);
}
void add(int x,int y){
int xx=find(x);
int yy=find(y);
if(xx==yy) return ;
fa[yy]=xx;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
string s;
int k=0;
for(int i=1;i<=n;i++) { cin >> b[i]; fa[i]=i; }
for(int i=1;i<=n;i++){
cin>>s;
for(int j=0;j<s.size();j++){
if(s[j]=='1'){
add(i,j+1);
}
}
}
for(int i=1;i<=n;i++){
int x=find(i);
if(ans[x]) continue;
int cnt=0;
for(int j=i;j<=n;j++){
if(find(j)==x){
c[cnt]=b[j];
d[cnt++]=j;
}
sort(c,c+cnt);
}
for(int j=0;j<cnt;j++){
ans[d[j]]=c[j];
}
}
for(int i=1;i<=n;i++){
cout<<ans[i]<<(i==n?'\n':' ');
}
return 0;
}
魔王降世
思路:暴力TLE,最后用二分查找能过,新知识
p = lower_bound(dt.begin(),dt.end(),qs+1)-dt.begin()
在从小到大的排序数组中,
lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
在从大到小的排序数组中,重载lower_bound()和upper_bound()
lower_bound( begin,end,num,greater<type>() ):从数组的begin位置到end-1位置二分查找第一个小于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
upper_bound( begin,end,num,greater<type>() ):从数组的begin位置到end-1位置二分查找第一个小于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
void solve()
{
int n,m,q;
cin>>n>>m>>q;
vector<pair<ll,ll>> vp(n);
for(int i = 0;i<n;i++) cin>>vp[i].first>>vp[i].second;
vector<ll> dt(n,1e18);
int x,y;
for(int i = 0;i<m;i++){
cin>>x>>y;
for(int j = 0;j<n;j++){
ll dis = (vp[j].first-x)*(vp[j].first-x)+(vp[j].second-y)*(vp[j].second-y);
ll dtm = sqrtl(dis);
if(dtm*dtm<dis) dtm+=1;
dt[j] = min(dt[j],dtm);
}
}
sort(dt.begin(),dt.end());
while(q--){
ll qs;
cin>>qs;
int p = lower_bound(dt.begin(),dt.end(),qs+1)-dt.begin();
cout<<p<<endl;
}
}
int main()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(0);
int testcase = 1;
while (testcase--)
solve();
return 0;
}
K. Puzzle
思路:暴力枚举,但这里用到了一个全排列函数
while(next_permutation(arr+1,arr+4+1));
#include<bits/stdc++.h>
using namespace std;
set<int> s;
void cdwy(int a,int b,int c,int d){
s.insert(a+b+c+d);
s.insert(a-b-c-d);
s.insert(a*b*c*d);//1
s.insert(a*b+c+d);
s.insert(a+b*c+d);
s.insert(a+b+c*d);//2
s.insert(a*b*c+d);
s.insert(a+b*c*d);
s.insert(a*b+c*d);//3
s.insert(a*b-c-d);
s.insert(a-b*c-d);
s.insert(a-b-c*d);//4
s.insert(a*b*c-d);
s.insert(a-b*c*d);
s.insert(a*b-c*d);//5
s.insert(a+b+c-d);
s.insert(a+b-c+d);
s.insert(a-b+c+d);//6
s.insert(a+b-c-d);
s.insert(a-b-c+d);
s.insert(a-b+c-d);//7
s.insert(a*b-c-d);
s.insert(a-b-c*d);
s.insert(a-b*c-d);//8
s.insert(a+b*c-d);
s.insert(a-b*c+d);
s.insert(a-b*c-d);//9
}
int main(){
int arr[5];
for(int i=1;i<=4;i++){
cin>>arr[i];
}
sort(arr+1,arr+4+1);
cdwy(arr[1],arr[2],arr[3],arr[4]);
do{
cdwy(arr[1],arr[2],arr[3],arr[4]);
}while(next_permutation(arr+1,arr+4+1));
cout<<s.size();
return 0;
}