A----Mischievous Problem Setter Gym - 102055A(bool----sort水题)
题意:
给定时间,做题。做题由易到难,最多做几道。
AC
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=1e5+10;
struct point {
int d, ti;
bool operator<(const point &x)const{
return d<x.d||(d==x.d&&ti<x.ti);
}
}p[maxn];
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t,kase=0;
cin>>t;
while(t--){
int n,m;cin>>n>>m;
for(int i=1; i<=n; i++)cin>>p[i].d;
for(int i=1; i<=n; i++)cin>>p[i].ti;
sort(p+1,p+1+n);
int ans=0;
for(int i=1; i<=n; i++){
if(p[i].ti<=m){
m-=p[i].ti;
ans++;
}
else break;
}
cout<<"Case "<<++kase<<": ";
cout<<ans<<endl;
}
return 0;
}
G题 题解(组合和思维)
传送门。。。。
I----Cockroaches Gym - 102055I(注意好讨论)
题意:
可以选择一行和一列消除。
求最多消除多少zl。并输出有多少种方案。
AC
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <map>
#define mp make_pair
using namespace std;
const int maxn=1e5+10;
typedef long long ll;
typedef pair<int,int>pa;
map<pa,int>cot;
map<int,int>xcnt,ycnt;
struct point {
int x,y;
}p[maxn];
int main()
{
// ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t,kase=0;scanf("%d", &t);//cin>>t;
while(t--){
// cot.clear();
xcnt.clear();ycnt.clear();
int n;scanf("%d", &n);//cin>>n;
int maxr=0, maxc=0;
for(int i=1; i<=n; i++){
scanf("%d%d", &p[i].x,&p[i].y);//cin>>p[i]
xcnt[p[i].x]++,ycnt[p[i].y]++;
maxc=max(maxc,xcnt[p[i].x]);
maxr=max(maxr,ycnt[p[i].y]);
}
printf("Case %d: ", ++kase);
if(xcnt.size()==1||ycnt.size()==1){
printf("%d 1\n",n);
continue;
}
if(maxr==1&&maxc==1){
printf("2 %lld\n", (ll)n*(ll)(n-1)/2);
continue;
}
ll num_r1,num_r2,num_c1,num_c2;
num_r1=num_r2=num_c1=num_c2=0;
for(auto x:xcnt){
if(x.second==maxc)num_c1++;
else if(x.second==maxc-1)num_c2++;
}
for(auto y:ycnt){
if(y.second==maxr)num_r1++;
else if(y.second==maxr-1)num_r2++;
}
ll ans1=num_c1*num_r1;
ll ans2=num_c1*num_r2+num_c2*num_r1;
for(int i=1; i<=n; i++){
int x,y;
x=p[i].x;y=p[i].y;
if(xcnt[x]+ycnt[y]==maxc+maxr)ans1--,ans2++;
if(xcnt[x]+ycnt[y]==maxc+maxr-1)ans2--;
}
if(ans1)printf("%d %lld\n", maxc+maxr, ans1);
else printf("%d %lld\n", maxc+maxr-1,ans2);
}
return 0;
}
L----Ultra Weak Goldbach’s Conjecture Gym - 102055L(构造&&质数)
题意:
哥德巴赫猜想的升级。
思路:
构造。
看第一个smaple
13=2+2+2+2+2+3;
那么我们能否前面几个由2组成,后面拿prime去凑?
答案是:
Y
E
S
YES
YES
- 假如n是odd奇数,那么我们前面先配2,2,2,3.保证有一个奇数。
因为假如剩下两个质数中没有2的话,那prime1和prime2一定是奇数。(质数中除了2,以外都是奇数
),且prime1+prime2=even,最后就凑出了这个odd。 - res=n-6-3。至于最后两个prime1,prime2的找法:就是枚举prime1,满足if(res-prime1)为质数,就找到了prime2了。
- 假如n是even偶数,那么就2,2,2,2.最后同
步骤2.
,不过res=n-8.
AC
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
ll a[10];
ll pri[maxn],vis[maxn],cnt=0;
void table(){
for(int i=0; i<maxn; i++)vis[i]=1;
for(ll i=2; i<maxn; i++){
if(vis[i]){
pri[++cnt]=i;
for(int j=i*2; j<maxn; j+=i)vis[j]=0;
}
}
}
bool prime(ll x){
ll mid=sqrt(x);
if(x<1)return false;
for(ll i=2; i<=mid; i++){
if(x%i==0)return false;
}
return true;
}
void work(ll x){
if(x&1){
x-=9;
printf("2 2 2 3 ");
for(int i=1; i<=cnt; i++){
if(prime(x-pri[i])){printf("%lld %lld\n", pri[i], x-pri[i]);return;}
}
}
else {
x-=8;
printf("2 2 2 2 ");
for(int i=1; i<=cnt; i++){
if(prime(x-pri[i])){printf("%lld %lld\n",pri[i],x-pri[i]);return ;}
}
}
}
int main()
{
//cout<<prime(2)<<' '<<prime(1);
// ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t,kase=0;scanf("%d", &t);//cin>>t;
table();
while(t--){
ll x;scanf("%lld", &x);//cin>>x;
printf("Case %d: ", ++kase);
if(x<=11){printf("IMPOSSIBLE\n");continue;}
work(x);
}
return 0;
}