題目鏈接:http://codeforces.com/contest/1047
A Little C Loves 3 I
#include<iostream>
#include<cstdio>
using namespace std;
int n;
int main()
{
cin>>n;
if(n%3==0){
cout<<"1 1 "<<n-2<<endl;
}
else if(n%3==1){
cout<<"1 2 "<<n-3<<endl;
}
else if(n%3==2){
cout<<"1 2 "<<n-3<<endl;
} return 0;
}
B Cover Points
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+9;
int n;
struct node{
int x,y;
friend bool operator <(node a,node b){
return a.x+a.y>b.x+b.y;
}
}a[maxn];
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].x>>a[i].y;
}
sort(a+1,a+n+1);
cout<<a[1].x+a[1].y<<endl;
return 0;
}
AB簡單不表
C Enlarge GCD
題意:刪一些數讓原序列的gcd變大,不能變大則輸出-1
解題思路:看到1e7其實已經想到標記數組的埃式篩法,也想到了除以他們的最大公約數,但是忽略了計算機思維中的通過篩法更新出最多的擁有共同公因數的最大值,感覺很不得勁,悵然若失,就是那種自己能寫出來,卻無從下手。還是那個教訓,將總問題分解成一個個子問題,仔細思考一一解決。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 3e5+9;
const int N=1e7+5e6+9;
int n;
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
int a[maxn];
int f[N],vis[N];
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
int ans=gcd(a[1],a[2]);
for(int i=3;i<=n;i++){
ans=gcd(ans,a[i]);
}
for(int i=1;i<=n;i++){
f[a[i]/ans]++;
}
int maxx=0;
for(int i=2;i<=N;i++){
if(vis[i])continue;
int cnt=0;
for(int j=i;j<=N;j+=i){
vis[j]=1;
cnt+=f[j];
}
maxx=max(cnt,maxx);
}
printf("%d\n",maxx?n-maxx:-1);
return 0;
}
D Little C Loves 3 II
題意:兩個相對格可以走日或者中間 隔兩個格子。給你n,m,問最多有多少相對格子。
解題思路:好像就是手推,沒啥其他的了,之前好像做過類似題目,不表了。