1.HDU:5138
签到题;直接减去那5个数就行了
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int maxn=1e6+10; typedef long long ll; int ans[maxn]; int b[maxn]; int main(){ std::ios::sync_with_stdio(false); int n; while(cin>>n){ ans[1]=n-15; ans[2]=n-7; ans[3]=n-4; ans[4]=n-2; ans[5]=n-1; int tot=0; for(int i=1;i<=5;i++){ if(ans[i]>0){ b[tot++]=ans[i]; } } for(int i=0;i<tot;i++){ if(i==tot-1)cout<<b[i]<<endl; else cout<<b[i]<<' '; } } return 0; }
2.HDU:6075
题意:给一个数组ai,求ai%m=k的个数大于其余的个数;
直接判断奇偶数个数;
#include <bits/stdc++.h> using namespace std; const int maxn=1e5+10; int a[maxn]; int main(){ ios::sync_with_stdio(false); int T; cin>>T; while(T--){ int n; cin>>n; int cnt1=0,cnt2=0; for(int i=1;i<=n;i++){ cin>>a[i]; if(a[i]%2)cnt1++; else cnt2++; } if(cnt1>cnt2){ cout<<"2"<<' '<<"1"<<endl; } else cout<<"2"<<' '<<"0"<<endl; } return 0; }
3.poj:2967
题意:给你n个木棒,判断是否符合条件:至少有三个木棒可以组合成三角形,并且存在三个木棒不能组合成三角形;
!!!!这题卡输入,当时没板子,就一直T;
解:排序,然后扫一遍记录能否组合成三角形,然后再用最小的两个木棒和最大的木棒,记录是否能形成三角形;
要用字符快读;
#include <cstdio> #include <algorithm> #include <iostream> using namespace std; const int maxn=1e6+10; typedef long long ll; ll a[maxn]; inline int read(){ ll x=0LL,f=1LL; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-')f=-1; ch=getchar(); } while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f; } int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;i++)a[i]=read(); //for(int i=1;i<=n;i++)cout<<a[i]<<' ';cout<<endl; sort(a+1,a+1+n); int flag=0,cnt=0; for(int i=1;i<=n-2;i++){ if((1LL*a[i]+1LL*a[i+1])>a[i+2])flag=1; else cnt=1; } if((1LL*a[1]+1LL*a[2])<=a[n])cnt=1; if((flag==0)||(cnt==0))printf("The set is rejected.\n"); else printf("The set is accepted.\n"); return 0; }
4.CF-892D
题意:给一个数组a,构造一个数组b,满足b上每个位置的每个字串前缀和都和a不同;
!!!当时读错题意:以为只是前缀和不同……狂wa,还tm以为是对的;
解:对a排序另存c,然后对每个ai找第一个大于ai的值放在bi(必定保证每个字串的前缀和不同),然后遇到最大值,放最小值;
#include <bits/stdc++.h> using namespace std; const int maxn=100; int a[maxn]; int b[maxn]; int ans[maxn]; bool vis[maxn]; int main(){ int n; cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; b[i]=a[i]; } sort(b+1,b+1+n); for(int i=1;i<=n;i++){ int flag=0; for(int j=1;j<=n;j++){ if(a[i]<b[j]&&!vis[j]){ ans[i]=b[j]; vis[j]=true; flag=1; break; } } if(flag==0){ ans[i]=b[1]; vis[1]=true; } } for(int i=1;i<=n;i++){ cout<<ans[i]<<' '; } cout<<endl; return 0; }
5.HDU:5687
题意:字典树;
!!!不知道错哪了,回宿舍再打一遍就。。。。。tm;
#include <bits/stdc++.h> using namespace std; struct node{ node *next[30]; int cnt; node(){ for(int i=0;i<30;i++)next[i]=NULL; cnt=0; } }; node *root=new node(); void add(string s){ int len=s.size(); node *p=root; for(int i=0;i<len;i++){ int x=s[i]-'a'; if(p->next[x]==NULL)p->next[x]=new node(); p=p->next[x]; p->cnt++; } } void gao(string s){ node *p=root; int len=s.size(); for(int i=0;i<len;i++){ int x=s[i]-'a'; if(p->next[x]==NULL){ cout<<"No"<<endl;return; } p=p->next[x]; } if(p->cnt>0)cout<<"Yes"<<endl; else cout<<"No"<<endl; } void alldel(node *p){ if(p==NULL)return; for(int i=0;i<30;i++){ if(p->next[i]==NULL)alldel(p->next[i]); } delete(p); } void del(string s){ int len=s.size(); node *p=root,*pre; for(int i=0;i<len;i++){ int x=s[i]-'a'; if(p->next[x]==NULL)return ; pre=p; p=p->next[x]; } int num=p->cnt; alldel(p); pre->next[s[s.size()-1]-'a']=NULL; p=root; for(int i=0;i<len-1;i++){ int x=s[i]-'a'; p=p->next[x]; p->cnt-=num; } } int main(){ int n; cin>>n; while(n--){ string s,q; cin>>q>>s; if(q[0]=='i')add(s); else if(q[0]=='s')gao(s); else del(s); } return 0; }
6.LightOJ-1095
题意:给1-n的数,求1-m中k个数位置不变的组合数;
错排:为啥他们都知道,就我不知道。。。~弱鸡
解:C(m,k)从m选k个不变的,剩下的m-k个错排,然后还有n-m个数,可能0个错排,1个错排,2,3,。。。;
所以要枚举所有可能;
错排公式:Dn=(n-1)(Dn-1+Dn-2);
#include <iostream> using namespace std; typedef long long ll; const int maxn=1e4+10; const int mod=1e9+7; ll c[maxn]; ll inv[maxn],fac[maxn],ans[maxn],pos[maxn]; ll qpow(ll a,int b) { ll ans=1; a%=mod; while(b) { if(b&1) ans=(ans*a)%mod; a=(a*a)%mod; b/=2; } return ans; } void pre() { fac[0]=fac[1]=1; for(int i=2;i<maxn;++i) fac[i]=i*fac[i-1]%mod; inv[maxn-1]=qpow(fac[maxn-1],mod-2); for(int i=maxn-2;i>=0;i--) inv[i]=inv[i+1]*(i+1)%mod; } ll Comb(int n,int k)//求C(n,k) { if (k < 0 || k > n) return 0; return fac[n]*inv[k]%mod *inv[n-k]%mod; } void init(){ c[0]=1; c[1]=0; c[2]=1; for(ll i=3;i<=1005;i++) c[i]=((i-1)*(c[i-1]+c[i-2]))%mod; } int main(){ init(); pre(); int T; cin>>T; int flag=1; while(T--){ int n,m,k; cin>>n>>m>>k; ll ans=0; for(int i=0;i<=n-m;i++){ ans=(ans+(c[n-k-i]%mod*Comb(n-m,i)%mod)%mod)%mod; } ans=((ans%mod)*(Comb(m,k)%mod))%mod; cout<<"Case "<<flag++<<": "; cout<<ans<<endl; } return 0; }
7.HDU:2962
8.CF:763A